subprocess.Popen和参数中的空格字符

时间:2015-08-24 18:37:45

标签: python macos python-2.7 subprocess osx-yosemite

我在OSX Yosemite上使用Python 2.7将桌面应用程序包装到Web应用程序中。

The documentation says the following

  

通常首选提供一系列参数,因为它允许模块处理任何必要的转义和引用参数(例如,允许文件名中的空格)“

......还有

  

在从外部输入构造命令字符串的情况下,强烈建议不要使用shell = True

这就是为什么我在调用带有长参数列表的subprocess.Popen并且shell = False

无论文档中写了什么,我在传递包含空格的参数时遇到问题。 在fork之后的调试器中,我看到我的参数直接转到os._execvpe而没有任何更改/转义。 然而,我正在启动的应用程序只接收该参数的第一个以空格分隔的部分。

有没有办法修复subprocess.Popen所以它的工作原理如何?提前谢谢。

P.S。可能是因为我列表中的一半参数是ASCII字符串,另一半是Unicode字符串吗?

更新:这是Python代码:

p = subprocess.Popen( arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE )

这是截断的参数列表:

['/Library/WebServer/Documents/XXX.app/Contents/MacOS/XXX',
'-project', u'/Library/WebServer/Documents/XXX.YYY',
'-user', u'bec4aed7-2ee2-4ec9-0f92-a301ee9d0115',
'-log', u'/Library/WebServer/Documents/Users/bec4aed7-2ee2-4ec9-0f92-a301ee9d0115/renderLog.txt',
'-text', '1', u'one two three four']

应用程序只收到那个“两个三四”的第一部分。

1 个答案:

答案 0 :(得分:0)

对我有用的解决方案是将所有命令行参数转换为Unicode,并将其转义。

这是我的转义方法,请注意它如何用反斜杠预先添加空格:

@staticmethod
def _escape_string( val ):
    # Make unicode
    val = unicode( val )
    # Escape stuff
    val = val.replace( u'\\', u'\\\\' )
    val = val.replace( u' ', u'\\ ' )
    return val

在更改之后,我的子进程开始收到完整的字符串。