【问题标题】:subprocess.Popen and space character in the arguments参数中的 subprocess.Popen 和空格字符
【发布时间】:2015-11-18 07:02:39
【问题描述】:

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

The documentation says the following

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

……还有

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

这就是我调用 subprocess.Popen 的原因,其中包含一长串参数和 shell=False

无论文档中写了什么,我在传递包含空格的参数时都遇到了问题。 在分叉后的调试器中,我看到我的参数直接转到 os._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 二 三四' 参数的第一部分。

【问题讨论】:

  • 向我们展示您的 Popen 调用代码和参数列表。
  • @miindlek 完成,请查看更新。
  • 什么是XXX.app?它是否适用于包含空格的参数?
  • 这是一个自定义应用程序。是的,当从 XXX.app/Contents/MacOS/XXX -text 1 "one 二三四" 之类的终端启动时,它可以正常工作。
  • 尝试编写一个简单地执行import sys; print sys.argv 的python 程序,看看调用它时会发生什么。 (使用 Ubuntu 处理您的数据对我来说很好。)

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多