Python subprocess.Popen在g ++中自动编译添加.cpp文件

时间:2017-10-29 09:16:35

标签: python c++ bash

如果我有一个相当大的文件库,并想要链接它们,我是否创建一个bash脚本然后将其放入python脚本中以获取我需要用于编译的终端行所需的所有文件。我不认为我正确建立它因为没有./test

#!/usr/bin/env python3
import os
import subprocess
file = open("react3dEngine.txt", "r")

fileList=file.readlines()
file.close()

p=subprocess.Popen(["/usr/bin/g++", "-Wall", str(fileList), "-lglut", 
"-lGLU", "-lGL", "-stdio=c+11", "-o", "test", 'main.cpp'], 
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p=subprocess.Popen(["./test"], stdout=subprocess.PIPE,  
stderr=subprocess.PIPE)
p.communicate()

2 个答案:

答案 0 :(得分:3)

问题可能发生在OBJC_CLASS_$_CIContext;你告诉g ++要找一个名为“['foo.c','bar.c']”的文件(列表的字符串化)。你应该有类似以下的东西

str(fileList)

答案 1 :(得分:1)

fileList是一个列表。在列表上调用str()会生成包含括号的格式化字符串,例如

>>> fileList = ['a.c', 'b.c', 'c.c']
>>> str(fileList)
"['a.c', 'b.c', 'c.c']"

因此不能作为命令行的一部分工作。

相反,您需要将文件列表中的每个字符串作为参数传递。您还需要删除使用readlines()读取的文件中可能存在的尾随新行(我不知道您的react3dEngine.txt文件的格式)。

尝试编码:

with open("react3dEngine.txt") as files:
    file_list = [line.strip() for line in files]
    p = subprocess.Popen(["/usr/bin/g++", "-Wall"] + file_list + ["-lglut", 
"-lGLU", "-lGL", "-std=c+11", "-o", "test", 'main.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # etc.

strip()处理输入文件中可能存在的任何前导和尾随空格。