gpt4 book ai didi

python - 调试 subprocess.Popen 调用

转载 作者:太空狗 更新时间:2023-10-29 21:44:45 43 4
gpt4 key购买 nike

我一直在使用 subprocess.Popen过去成功地,当用 python 脚本包装二进制文件以格式化参数/自定义等...

开发第 n 个包装器,我像往常一样......但没有任何反应。

这是小代码:

print command
p = subprocess.Popen(command, shell = True)
result = p.communicate()[0]
print vars(p)
return result

这是输出:

/usr/bin/sh /tmp/run/launch.sh
{'_child_created': True, 'returncode': 0, 'stdout': None, 'stdin': None, 'pid': 21650, 'stderr': None, 'universal_newlines': False}

如您所见,目标是创建一个 shell 脚本来设置我需要的一切,然后执行它。我更愿意使用真正的 python 代码,但不幸的是 launch.sh调用我不想尝试和复制的第 3 方 shell 脚本(尽管我已经坚持使用 python api 一年多了)。

问题在于:

  • shell 脚本没有执行(它应该生成进程并输出一些小东西)
  • 没有引发 python 异常
  • p 中没有任何内容指示发生错误的对象

我试过了check_call也没有任何成功...

我不知道我应该做什么,如果有人能指出我的错误或指导我解决问题,我会很高兴...

编辑:

  • 尝试在 Linux (sh) 上运行它
  • shell 是调用脚本中变量替换所必需的

编辑 2:

正在关注 badp建议,我调整了代码并添加了

subprocess.Popen('ps', shell = True).communicate()

p = ... 之后创建进程的行,这里是输出:

/usr/bin/sh /tmp/run/launch.sh
PID TTY TIME CMD
29978 pts/0 00:00:01 zsh
1178 pts/0 00:00:01 python
1180 pts/0 00:00:00 sh <defunct>
1181 pts/0 00:00:00 ps
None

显然该过程已启动(即使是 <defunct> )并且还应该注意我在传递参数时遇到了一些问题...

谢谢。

最佳答案

感谢 badp 和他的调试建议,我终于找到了问题的答案。

来自 subprocess module 上的 python 页面:

The executable argument specifies the program to execute. It is very seldom needed: Usually, the program to execute is defined by the args argument. If shell=True, the executable argument specifies which shell to use. On Unix, the default shell is /bin/sh. On Windows, the default shell is specified by the COMSPEC environment variable. The only reason you would need to specify shell=True on Windows is where the command you wish to execute is actually built in to the shell, eg dir, copy. You don’t need shell=True to run a batch file, nor to run a console-based executable.

由于我在 Linux 上并使用 shell=True,我的命令实际上是一个参数列表,由 executable 执行,默认为 /bin/sh.因此,执行的完整命令是:/bin/sh/usr/bin/sh/tmp/run/launch.sh... 效果不是很好。

我应该使用:

subprocess.Popen('/tmp/run/launch.sh', shell=True)

subprocess.Popen('/tmp/run/launch.sh', executable = '/usr/bin/sh', shell=True)

棘手的是 shell=True 实际上只会在 Linux 上修改默认的 executable 值...

关于python - 调试 subprocess.Popen 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2206407/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com