python - 使用子进程执行的子 Python 没有输出

标签 python subprocess

这是一个可以从命令行运行的简单命令:

> python -c "print('asdasd')"
asdasd

但是从脚本执行时无法输出任何内容:

import os
import sys
import subprocess

cmd = [sys.executable] + ['-c', '"print(\'asdasd\')"']
print cmd
kwargs = {
  'stdout': subprocess.PIPE,
  'stderr': subprocess.PIPE,
  'stdin': subprocess.PIPE,
}

print subprocess.Popen(cmd).communicate()
print subprocess.Popen(cmd, **kwargs).communicate()

输出:

['C:\\Python27\\python.exe', '-c', '"print(\'asdasd\')"']
(None, None)
('', '')

为什么它不产生任何东西?我没主意了。对我来说,这像是 Python 2.7.11 中的一个错误。

最佳答案

首先,您不需要在命令行参数中为 '"print(\'asdasd\')"' 添加额外的双引号。事实上,您的代码将只执行执行以下操作的 Python 代码:"print(\'asdasd\')"。换句话说,它将生成字符串:print(\'asdasd\')

显然,创建字符串不会打印任何内容。这是代码的修补版本:

import os
import sys
import subprocess

cmd = [sys.executable] + ['-c', 'print(\'asdasd\')']
print cmd
kwargs = {
    'stdout': subprocess.PIPE,
    'stderr': subprocess.PIPE,
    'stdin': subprocess.PIPE,
}

print subprocess.Popen(cmd).communicate()
print subprocess.Popen(cmd, **kwargs).communicate()

您可能想使用shlex解析命令行参数的模块。

例如,使用 shlex 模块和字符串格式的三引号(不要忘记 python 路径的引号,否则将解释反斜杠等字符):

import sys
import shlex
import subprocess

cmd_str = '''"{}" -c "print('asdasd')"'''.format(sys.executable)
print(cmd_str)
cmd = shlex.split(cmd_str)
print(cmd)
kwargs = {
    'stdout': subprocess.PIPE,
    'stderr': subprocess.PIPE,
    'stdin': subprocess.PIPE,
}
print(subprocess.Popen(cmd).communicate())
print(subprocess.Popen(cmd, **kwargs).communicate())

关于python - 使用子进程执行的子 Python 没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37919793/

相关文章:

python - 不同阶段有不同的 initial_data fixture(测试与生产)

python - 使用 shell 管道时 subprocess.run 的返回码

python - 使 tkinter 标签按设定的时间间隔刷新,无需输入

python - 为什么 pytesseract 抛出 WinError 6?

当脚本不在同一文件夹中时,Python、os.system 失败

python - NZEC 在 spoj FACKT

python - 多POST查询( session 模式)

python - 如何在 python 中下载彩色 KEGG PATHWAY map

python - 使用 PySimpleGUI 创建自定义进度条

python - 使用生成的文件名进行子进程调用