我一直在编写一个简单的python脚本来编译和运行给定的.cpp文件。
我已经按预期工作了但是我希望能够在.cpp文件的编译产生错误或警告时停止脚本,而不是继续执行.exe文件。
# run_cpp.py
# Script that compiles and executes a .cpp file
# Usage:
# python run_cpp.py -i <filename> (without .cpp extension)
import sys, os, getopt
def main(argv):
cpp_file = ''
exe_file = ''
try:
opts, args = getopt.getopt(argv, "hi:",["help",'ifile='])
except getopt.GetoptError as err:
# print help information and exit
print(err)
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-i", "--ifile"):
cpp_file = a + '.cpp'
exe_file = a + '.exe'
run(cpp_file, exe_file)
def usage():
print('run_cpp.py -i <filename> (without .cpp extension)')
def run(cpp_file, exe_file):
os.system("echo Compiling " + cpp_file)
os.system('g++ ' + cpp_file + ' -o ' + exe_file)
os.system("echo Running " + exe_file)
os.system("echo -------------------")
os.system(exe_file)
if __name__=='__main__':
main(sys.argv[1:])
当我在Windows MINGW上运行以下命令时,一切都很棒。
$ python run_cpp.py -i hello
Compiling hello.cpp
Running hello.exe
-------------------
Hello, world!
其中hello.cpp是: -
#include <iostream>
using namespace std;
int main() {
cout << "Hello, world!" << endl;
return 0;
}
如果我在endl之后省略分号,脚本会继续运行.exe文件,尽管编译错误。
$ python run_cpp.py -i hello
Compiling hello.cpp
hello.cpp: In function 'int main()':
hello.cpp:8:5: error: expected ';' before 'return'
return 0;
^~~~~~
Running hello.exe
-------------------
Hello, world!
在尝试运行.exe文件之前,如何让我的脚本知道编译是否成功?
我已根据答案更新了代码。
if os.system('g++ ' + cpp_file + ' -o ' + exe_file) == 0:
os.system(exe_file)
现在,脚本只会在编译成功时执行.exe文件。
根据python文档的建议,使用子进程库而不是 os 库执行相同操作的另一种方法是 -
def run(cpp_file, exe_file):
x = subprocess.getoutput('g++ ' + cpp_file + ' -o ' + exe_file)
if x == "": # no error/warning messages
subprocess.run(exe_file) # run the program
else:
print(x) # display the error/warning
答案 0 :(得分:1)
对于某些特定于命令的成功定义,所有命令都返回一个退出代码,指定命令是否成功。 os.system
通常会返回此退出代码,其中0
通常表示“成功”,而任何其他退出代码都表示错误:
if os.system("g++ foo.c") == 0:
print ("Worked")
else:
print ("Failed")
The documentation提到了一些警告和更好的API:
在Unix上,返回值是以wait()指定的格式编码的进程的退出状态。请注意,POSIX没有指定C系统()函数的返回值的含义,因此Python函数的返回值是依赖于系统的。
在Windows上,返回值是运行命令后系统shell返回的值。 shell由Windows环境变量COMSPEC给出:它通常是cmd.exe,它返回命令运行的退出状态;在使用非本机shell的系统上,请参阅shell文档。
子流程模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。有关一些有用的配方,请参阅子流程文档中的“使用子流程模块替换旧函数”部分。