<p><code>os.system('g++ ...')</code>不会直接启动g++进程。它实际上启动任何配置为默认shell的东西(例如/bin/sh),然后shell解释命令行。你知道吗</p>
<p>为了避免这种不必要的循环及其复杂性,您可以直接使用Python的子流程.Popen以及它的communicate()方法。这允许您将命令行参数作为数组传递。你知道吗</p>
<p>例如:</p>
<pre><code>import sys, subprocess
filename2only = '">gi|111>gi|222>gi|333>gi|444"'
args = [
'g++',
'-std=c++0x', 'mutualcepepe.cpp',
'-Ddjangoname=' + str(filename2only),
'-omutualout'
]
p = subprocess.Popen(args=args, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
sys.stdout.write(stdout)
sys.stderr.write(stderr)
if p.returncode != 0: sys.stderr.write('failed with exit code: ' + str(p.returncode))
</code></pre>
<p>这会将<code>-Ddjangoname=">gi|111>gi|222>gi|333>gi|444"</code>选项传递给编译器,该选项相当于<code>#define djangoname ">gi|111>gi|222>gi|333>gi|444"</code>。你知道吗</p>
<p>注意,<code>str(filename2only)</code>在这种情况下并不是绝对必要的,但是它具有支持任何类型的值(string、int或float)的良好特性。你知道吗</p>
<p>例如,你可以:</p>
<p><code>filename2only = 12.3</code>传递<code>-Ddjangoname=12.3</code>,相当于<code>#define djangoname 12.3</code></p>
<p><code>filename2only = 'a b c'</code>传递<code>-Ddjangoname=a b c</code>,相当于<code>#define djangoname a b c</code></p>
<p><code>filename2only = '"a b c"'</code>传递<code>-Ddjangoname="a b c"</code>,相当于<code>#define djangoname "a b c"</code></p>
<p><code>filename2only = '"a \\"b\\" c"'</code>传递<code>-Ddjangoname="a \"b\" c"</code>,相当于<code>#define djangoname "a \"b\" c"</code>,即djangName是字符串<code>a "b" c</code>,包含双引号!你知道吗</p>