我似乎subprocess.Popen()
在 Windows XP x64 机器上发现了一个问题。如果Popen()
使用 调用Shell=True
,而不是创建子进程,则会出现错误
The syntax of the command is incorrect
打印到命令提示符。
尝试在命令行上使用 Mercurial 时发现了该问题。'hg resolve' 会因上述错误而崩溃。我已将其缩小为 Popen() 的问题,并制作了一个 <10 行的脚本来重现该问题。这个问题也存在于各种地方的 tortoisehg 中,也是因为它使用了Popen()
with Shell=True
。
有趣的是,如果我使用 Shell=False 运行我的测试代码,它可以正常工作(发生预期的行为)。Shell=True
我已经在 Windows x86 版本上测试了代码,并且两者都False
按预期工作。这台特定的机器对 PATH 进行了一些自定义,但没有什么严重的。
有谁知道这台 x64 机器有什么不同会导致这个错误。在我开始工作之前,机器已经安装/设置,所以我不确定发生了什么变化。到目前为止,我唯一的想法是由于不正确地转义参数(或相关的东西)而发生了一些错误,但是我不确定这可能发生在哪里。
仅出于提供信息的目的,我已将 Mercurial 的一个调用发布到Popen
,以防有人发现可能是问题的东西
p = subprocess.Popen(cmd, shell=True, bufsize=-1,
close_fds=closefds,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
universal_newlines=newlines,
env=env)
不幸的是,我现在不能发布测试代码(它正在工作),但是我会在我可以得到它的那一刻发布更新。
更新,测试代码如下...
import os
import sys
import subprocess
if 'THG_HGTK_SPAWN' in os.environ:
print 'spawn successful'
sys.exit(0)
os.environ['THG_HGTK_SPAWN'] = '1'
subprocess.Popen(args={'python', r'test.py'}, shell=True)
print 'spawning...'
sys.exit(0)