使用子进程从 python 脚本编译 C++ 程序
Using subprocess for compiling a c++ program from python script
我知道这里有一些类似的问题 Invoking C compiler using Python subprocess command and subprocess, invoke C-program from within Python 但我相信我的问题在某种意义上是不同的。
我需要编译一个使用一些 ROOT 库的 c++ 程序,所以我需要添加一些标志和 link 一些库来进行编译。因此我在正常 shell 上的编译行是:
> $($ROOTSYS/bin/root-config --cxx) $($ROOTSYS/bin/root-config --cflags --glibs) Analysis.cxx -o analysis.exe
效果很好。我想从我的 python 脚本中进行编译。我已经阅读了 subprocess 模块的文档,但是如果不在 subprocess.Popen 的调用中使用 shell=True
就无法获得解决方案,我并没有真正理解其中的区别。如果我使用:
process = Popen(["$($ROOTSYS/bin/root-config --cxx) $($ROOTSYS/bin/root-config --cflags --glibs) Analysis.cxx -o analysis.exe"], shell=True)
完成任务。然而,这:
process = Popen(["$($ROOTSYS/bin/root-config --cxx)", "$($ROOTSYS/bin/root-config --cflags --glibs)", "Analysis.cxx", "-o", "analysis.exe"])
我得到以下信息:
Traceback (most recent call last):
File "make_posanalysis.py", line 45, in <module>
"Analysis.cxx", "-o", "analysis.exe"])
File "Python/2.7.15/x86_64-slc6-gcc62-opt/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "Python/2.7.15/x86_64-slc6-gcc62-opt/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我想了解 using/not 使用 shell=True
之间的区别,因为这似乎是使脚本工作与否的原因。或者,还有什么我想念的吗?
If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself. That is to say, Popen does the equivalent of:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
所以它正在执行相当于:
/bin/sh -c '$($ROOTSYS/bin/root-config --cxx)' '$($ROOTSYS/bin/root-config --cflags --glibs)' "Analysis.cxx", "-o", "analysis.exe"
这不是你想要的,因为它只对第一个参数进行 $(...)
扩展;如果第一个参数中的命令引用 </code>、<code>
等
,则其他所有内容都按字面意思进行,并成为位置参数
如果您希望 shell 解析所有内容,只需提供一个字符串即可。
我知道这里有一些类似的问题 Invoking C compiler using Python subprocess command and subprocess, invoke C-program from within Python 但我相信我的问题在某种意义上是不同的。
我需要编译一个使用一些 ROOT 库的 c++ 程序,所以我需要添加一些标志和 link 一些库来进行编译。因此我在正常 shell 上的编译行是:
> $($ROOTSYS/bin/root-config --cxx) $($ROOTSYS/bin/root-config --cflags --glibs) Analysis.cxx -o analysis.exe
效果很好。我想从我的 python 脚本中进行编译。我已经阅读了 subprocess 模块的文档,但是如果不在 subprocess.Popen 的调用中使用 shell=True
就无法获得解决方案,我并没有真正理解其中的区别。如果我使用:
process = Popen(["$($ROOTSYS/bin/root-config --cxx) $($ROOTSYS/bin/root-config --cflags --glibs) Analysis.cxx -o analysis.exe"], shell=True)
完成任务。然而,这:
process = Popen(["$($ROOTSYS/bin/root-config --cxx)", "$($ROOTSYS/bin/root-config --cflags --glibs)", "Analysis.cxx", "-o", "analysis.exe"])
我得到以下信息:
Traceback (most recent call last):
File "make_posanalysis.py", line 45, in <module>
"Analysis.cxx", "-o", "analysis.exe"])
File "Python/2.7.15/x86_64-slc6-gcc62-opt/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "Python/2.7.15/x86_64-slc6-gcc62-opt/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我想了解 using/not 使用 shell=True
之间的区别,因为这似乎是使脚本工作与否的原因。或者,还有什么我想念的吗?
If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself. That is to say, Popen does the equivalent of:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
所以它正在执行相当于:
/bin/sh -c '$($ROOTSYS/bin/root-config --cxx)' '$($ROOTSYS/bin/root-config --cflags --glibs)' "Analysis.cxx", "-o", "analysis.exe"
这不是你想要的,因为它只对第一个参数进行 $(...)
扩展;如果第一个参数中的命令引用 </code>、<code>
等
如果您希望 shell 解析所有内容,只需提供一个字符串即可。