【问题标题】:How to send a string with spaces from Python to Bash sub-process as a single value?如何将带有空格的字符串从 Python 发送到 Bash 子进程作为单个值?
【发布时间】:2017-01-04 15:37:36
【问题描述】:

我正在尝试将变量从 python 脚本发送到 bash 脚本。我正在使用popen,如下所示:

subprocess.Popen(["bash", "-c", ". mainGui_functions.sh %d %s" % (commandNum.get(), entryVal)])

但是,entryVal 有时可以包含一个或多个空白字符。在这种情况下,我将字符串分成多个参数 ($2,$3..)

我怎样才能在一个论点中得到它?

【问题讨论】:

  • 尝试添加mainGui_functions.sh的完整路径。
  • 您是否尝试过在 entryVal 周围添加引号...类似 "%d \"%s\""
  • 也许这可能会有所帮助,来自 bash 脚本结尾 stackoverflow.com/questions/1983048/…
  • 另外,考虑使用 str.format 而不是插入 % 字符,以获得更 Pythonic 的风格。
  • 启动一个 Bash 实例,以便您可以获取文件然后立即退出,这很奇怪。除非这是现实中更复杂事物的简化版本,否则您只需要 Popen(['bash', 'mainGui_functions', str(commandNum.get()), entryVal])(如果脚本具有执行权限和适当的 shebang 行,也可以省略 'bash')。

标签: python bash subprocess


【解决方案1】:

简单的解决方案#1:与在命令行中输入输入时完全相同的方式进行操作;把它放在引号中:

subprocess.Popen(["bash", "-c", ". mainGui_functions.sh {} '{}'".format(commandNum.get(), entryVal)])

简单的解决方案#2:如果mainGui_functions.sh 已经是可执行的,那么您可以省略bash 部分并直接将参数传递给它。在这种情况下,subprocess 负责确保带有空格的条目最终成为您的单个 arg:

subprocess.Popen(["mainGui_functions.sh", str(commandNum.get()), entryVal])

【讨论】:

  • "mainGui_functions.sh" 周围添加了缺失的引号,来自"mainGui_functions.sh ;)
【解决方案2】:

在你的 bash 命令行中加上引号——例如,

subprocess.Popen(['bash', '-c', '. mainGui_functions.sh %d "%s"' % (commandNum.get(), entryVal)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多