Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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和空格字符_Python_Macos_Python 2.7_Subprocess_Osx Yosemite - Fatal编程技术网

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

Python 参数中的subprocess.Popen和空格字符,python,macos,python-2.7,subprocess,osx-yosemite,Python,Macos,Python 2.7,Subprocess,Osx Yosemite,我正在OSX Yosemite上使用Python 2.7将桌面应用程序包装成web应用程序 : 通常首选提供一系列参数,因为它允许模块处理任何必需的参数转义和引用(例如,允许文件名中有空格) …而且 如果命令字符串是由外部输入构造的,则强烈建议不要使用shell=True 这就是为什么我调用subprocess.Popen,并使用一长串参数和shell=False 不管文档中写了什么,我在传递包含空格的参数时遇到了问题。 在fork之后的调试器中,我看到我的参数直接进入os.\u execvpe

我正在OSX Yosemite上使用Python 2.7将桌面应用程序包装成web应用程序

:

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

…而且

如果命令字符串是由外部输入构造的,则强烈建议不要使用shell=True

这就是为什么我调用subprocess.Popen,并使用一长串参数和shell=False

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

有没有办法修复subprocess.Popen,使其按文档所述工作?提前谢谢

另外,可能是因为我列表中一半的参数是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']

应用程序只接收u'one-two-three-four'参数的第一部分。

对我有效的解决方案是将所有命令行参数转换为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

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

对我有效的解决方案是将所有命令行参数转换为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

更改后,“我的子进程”开始接收完整的字符串。

向我们显示Popen调用的代码和参数列表。@miindlek完成,请查看更新。什么是
XXX.app
?它能与包含空格的参数正常工作吗?它是一个自定义应用程序。是的,当从XXX.app/Contents/MacOS/XXX-text 1“一二三四”这样的终端启动时,它工作正常;打印sys.argv并查看调用它时会发生什么。(在Ubuntu上你的数据对我很有用。)给我们看看你的Popen调用代码和参数列表。@miindlek完成,请查看更新。什么是
XXX.app
?它能与包含空格的参数正常工作吗?它是一个自定义应用程序。是的,当从XXX.app/Contents/MacOS/XXX-text 1“一二三四”这样的终端启动时,它工作正常;打印sys.argv并查看调用它时会发生什么。(使用Ubuntu和您的数据对我来说效果很好。)