创建一个python脚本来编译和运行c ++文件

时间:2018-03-23 21:28:22

标签: windows bash python-3.x compilation

我一直在编写一个简单的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

1 个答案:

答案 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文档。

     

子流程模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。有关一些有用的配方,请参阅子流程文档中的“使用子流程模块替换旧函数”部分。