【问题标题】:subprocess cannot run python executable in non-interactive mode?子进程无法在非交互模式下运行 python 可执行文件?
【发布时间】:2018-05-17 17:34:18
【问题描述】:

我正在使用 python 3.6.3 和 subprocess 模块来运行另一个 python 脚本

#  main.py

#!/bin/env python
from subprocess import Popen,PIPE
from sys import executable

p = Popen([executable, 'test.py', 'arg1'],shell=True, stdout=PIPE)
p.wait()
print(p.stdout.read().decode())

#  test.py

import sys
print(sys.argv)

我希望它会运行并执行test.py。但是,它会以交互模式打开一个 python 解释器!

我测试了shell=False 选项,它有效。我测试了字符串形式而不是args 的列表形式,它可以工作。

我不确定这是否是一个错误。

【问题讨论】:

  • 如果 stdin 连接到 TTY,CPython 将进入交互模式。 Popen 的默认设置是继承默认的 io 句柄,它将第二个解释器也连接到您的 TTY。尝试传递stdin=None
  • @user2722968 我无法在 Python 3.6.5rc1 中看到这种行为。如果我从终端(其中 stdin 是 tty)运行 python3 test.py arg1,它会运行脚本而不会掉入交互式 shell。

标签: python shell subprocess interpreter


【解决方案1】:

您需要删除shell=True 或将第一个参数更改为executable + ' test.py arg1' 而不是[executable, 'test.py', 'arg1']

the documentation 中所述,使用shell = True,它将以/bin/sh -c python test.py arg1 运行,这意味着python 将不带参数运行。

【讨论】:

  • 这太可怕了,会导致更复杂的参数出现问题
  • 这是合理的,文档解释了它是如何工作的。真正导致问题的是在不了解其工作原理的情况下使用某些东西。
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2011-06-05
  • 2021-09-15
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多