2k1
  • Home
  • Programming
  • System
  • Design
  • Applications
  • Tech
No Result
View All Result
  • Login
2k1
  • Home
  • Programming
  • System
  • Design
  • Applications
  • Tech
No Result
View All Result
2k1
No Result
View All Result

Xây dựng một công cụ đơn giản để chạy và test thời gian chạy mã nguồn C++ bằng Python

Nguyen Pham by Nguyen Pham
07/08/2021
in Programming, CPP, Python
Reading Time: 4 mins read
A A
0

Khi code C++ mỗi lần test chúng ta cần nhập thủ công input và output, chúng ta cũng không biết thời gian chạy của code là bao nhiêu do vậy chúng ta sẽ xây dựng một công cụ bằng python giúp ta tự động làm việc này.

Về cơ bản chúng ta sẽ sử dụng python để chạy một số lệnh như mình chạy trong cmd vd như:

Compile C++:

g++ code.cpp -o tmp.exe

Run:

tmp.exe < input.txt > output.txt

Bắt đầu code python:

import os
import time
import subprocess

t = time.time()
subprocess.run(['g++','code.cpp','-o','tmp.exe'])

os.system("tmp.exe < input.txt > tmp.txt")
print(time.time()-t)

f = open('output.txt','r').read().strip();
tmp = open('tmp.txt','r').read().strip();

if(f==tmp):
    print("OK")
else:
    print("WA")

Đoạn code trên là chương trình python đơn giản để thực hiện việc chạy file c++.

time.time() Lấy thời gian hiện tại

subprocess.run(['g++','code.cpp','-o','tmp.exe']) Chạy một lệch cmd như chương trình con.

os.system("tmp.exe < input.txt > tmp.txt") chạy một lệnh cmd nhưng yêu cầu hệ điều hành chạy

=> chúng ta sẽ tìm hiểu sau về chúng.

Đoạn code trên cơ bản đã đáp ứng được nhưng vấn đề gặp phải là biên dịch lỗi, chạy quá thời gian thì chưa làm được. Bây giờ hãy cập nhật đoạn mã trên lên 1 level mới.

import os
import time
import subprocess
import compare

compileTimeout = 5
runTimeout = 5
compare.formatInput('input.txt')
compare.formatInput('dest.txt')
compileProc = subprocess.run(
    ['g++', 'code.cpp', '-o', 'tmp.exe'], timeout=compileTimeout, capture_output=True)
err = compileProc.stderr

if err != b'':
    print("Compile ERROR", err.decode())
else:
    try:
        t = time.time()
        runProc = subprocess.Popen(
            args=["tmp.exe"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        grep_stdout = runProc.communicate(
            input=open('input.txt', 'rb').read(), timeout=runTimeout)[0]
        print(grep_stdout.decode())
        with open("output.txt", 'w', encoding='utf-8', newline='\n') as f:
            f.write(grep_stdout.decode())
        print("RUN TIME: ", (time.time()-t))
        compare.compareFile('output.txt', 'dest.txt')
    except Exception:
        print("TLE")
        runProc.kill()

compare là file để fomat lại input. Mình sẽ để trong github ở dưới.

subprocess.run Như đã giới thiệu ở trên thì thằng này sẽ chạy 1 chương trình con ngay trong chương trình chính.

  • Tham số đầu tiên là mảng lệnh  ['g++', 'code.cpp', '-o', 'tmp.exe']
  • timeout Khi quá thời gian này thì subprocess bị dừng. Tính bằng giây

subprocess.Popen Thằng này cũng như subprocess.run nhưng điểm khác là nó có thể tương tác trong quá trình chạy.

grep_stdout = runProc.communicate(input=open('input.txt', 'rb').read(), timeout=runTimeout)[0]

sử dung communicate để truyền input vào và nhận output ra. Dữ liệu vào ở dạng binary.

Như vậy chúng ta đã xây dựng được công cụ tự động chạy code c++.

repo: https://github.com/npv2k1/CTDLvaGT/tree/master/tool

Một số tài liệu tham khảo:

  • https://docs.python.org/3/library/subprocess.html
  • https://devdocs.io/python~3.8/library/subprocess#subprocess.Popen
  • https://stackoverflow.com/questions/163542/how-do-i-pass-a-string-into-subprocess-popen-using-the-stdin-argument
Tags: c++ospythonsubprocesstime
Previous Post

Bắt đầu một trang web sử dụng wordpress và docker

Next Post

Chặn quảng cáo với pi-hole

Related Posts

Xây dựng todo app với smartcontract
Go

Giới thiệu về đa luồng trong ngôn ngữ lập trình go có code minh họa.

by Nguyen Pham
29/06/2023
Programming

Lập trình rust cơ bản – vòng lặp

by Nguyen Pham
22/12/2022
Programming

Lập trình python cơ bản – Hello world

by Nguyen Pham
16/11/2022
Programming

Lập trình go cơ bản – Hello world

by Nguyen Pham
04/12/2022
Programming

Lập trình rust cơ bản – Biến

by Nguyen Pham
16/11/2022
Programming

Lập trình rust cơ bản – hello world

by Nguyen Pham
14/11/2022
Load More
Next Post
Chặn quảng cáo với pi-hole

Chặn quảng cáo với pi-hole

Please login to join discussion
Stock

Phân tích mã cổ phiếu VCB

by Nguyen Pham
26/04/2025
0

Phân tích mã cổ phiếu VCB (Ngân hàng TMCP Ngoại thương Việt Nam - Vietcombank) 1. Tổng quan về Vietcombank...

Read more

Facebook, Instagram bất ngờ sập trên diện rộng, liên tục đăng xuất người dùng!

05/03/2024
Xây dựng todo app với smartcontract

Web3 là gì?

30/06/2023
Xây dựng todo app với smartcontract

Giới thiệu về đa luồng trong ngôn ngữ lập trình go có code minh họa.

29/06/2023

Chạy ứng dụng react native đầu tiên của bạn

29/06/2023

@2021 2k1.org [email protected]

No Result
View All Result
  • Home
  • Review
  • Applications
  • Computers
  • Gaming
  • Microsoft

© 2021 NData

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In