【问题标题】:Why are hex digits not passed correctly in python subprocess为什么在 python 子进程中未正确传递十六进制数字
【发布时间】:2016-01-18 16:32:15
【问题描述】:

我无法通过 python subprocess.Popen... 使用 2.6 插入模式。

测试:打开python解释器...

import subprocess
a = subprocess.Popen(['ping', '-c 1', '-p ff', '172.16.1.1'],subprocess.PIPE)

结果 ... ping:模式必须指定为十六进制数字。

我已将 ff 替换为:“f”、“23”、23、0x23 和一系列内容。我只是想看看shell认为它得到了什么。但是 shell=True 并没有像我预期的那样做,a.communicate() 给出了 (none,none)

【问题讨论】:

    标签: python hex subprocess parameter-passing


    【解决方案1】:

    确保将所有“单词”拆分为各自的列表条目:

    a = subprocess.Popen(['ping', '-c', '1', '-p' 'ff', '172.16.1.1'],subprocess.PIPE)
    # PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
    

    按照你的方式,你的命令被执行为

    ping -c\ 1 -p\ ff 172.16.1.1
    

    (args 和它们的值之间的空格被转义)

    【讨论】:

    • 这很好,谢谢。你能给我一个方法来验证这一点吗?一种直观地验证您所说内容的简单方法,它会很有帮助。
    • 在终端中可以写-p ff-pff。在第一种情况下,空格被忽略。但是,当您像-p\ ff 一样转义空间时,它不会被忽略。它成为十六进制值的一部分。 Ping 将接受ff,但不接受_ff(其中_ 是前导空格)。
    【解决方案2】:

    除了 Martin Konecny 的回答:导入 shlex 并让它为您完成工作。

    subprocess.Popen(shlex.split('ping -c 1 -p ff 127.0.0.1'), subprocess.PIPE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2016-11-12
      • 2013-06-09
      • 2017-07-30
      相关资源
      最近更新 更多