Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen在g++;自动添加.cpp文件_Python_C++_Bash - Fatal编程技术网

Python subprocess.Popen在g++;自动添加.cpp文件

Python subprocess.Popen在g++;自动添加.cpp文件,python,c++,bash,Python,C++,Bash,如果我有一个相当大的文件库,并且想要链接它们,那么我需要创建一个bash脚本,然后将其放入一个python脚本中,以获得我需要编译的终端行所需的所有文件。我认为我没有正确地构建它,因为没有测试 #!/usr/bin/env python3 import os import subprocess file = open("react3dEngine.txt", "r") fileList=file.readlines() file.close() p=subprocess.Popen(["/u

如果我有一个相当大的文件库,并且想要链接它们,那么我需要创建一个bash脚本,然后将其放入一个python脚本中,以获得我需要编译的终端行所需的所有文件。我认为我没有正确地构建它,因为没有测试

#!/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()

问题可能出在
str(文件列表)
;您正在告诉g++查找一个名为“['foo.c','bar.c']”(列表的字符串化)的文件。您应该有如下内容

["/usr/bin/g++", "-Wall"] + fileList + ["-lglut", "-lGLU", "-lGL", "-std=c+11", "-o", "test", 'main.cpp']

问题可能出在
str(文件列表)
;您正在告诉g++查找一个名为“['foo.c','bar.c']”(列表的字符串化)的文件。您应该有如下内容

["/usr/bin/g++", "-Wall"] + fileList + ["-lglut", "-lGLU", "-lGL", "-std=c+11", "-o", "test", 'main.cpp']

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()
处理输入文件中可能存在的任何前导和尾随空格。

文件列表是一个列表。在列表上调用
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()
处理输入文件中可能存在的任何前导和尾随空格。

-stdio=c+11
您的意思是不是
-std=c++11
?您应该包括您得到的任何错误,还可以尝试直接将生成的命令剪切并粘贴到命令行中,以查看是否有效。
-stdio=c+11
您的意思是不是
-std=c++11
?您应该包括您得到的任何错误,还可以尝试直接剪切和粘贴您构建到命令行中的命令,以查看其是否有效。-std=c++11并停止错误捕获,现在我可以看到我的批处理脚本没有获得我认为readlink-f foo.cpp会有效的文件路径。谢谢。-std=c++11并停止了错误捕获,现在我可以看到我的批处理脚本没有得到我认为readlink-f foo.cpp会起作用的文件路径。谢谢