子进程stdin输入

时间:2015-11-28 20:25:50

标签: python subprocess stdin

我试图将参数传递给我的test_script.py但是我收到了以下错误。我知道这不是最好的方法,但它是唯一可行的,因为我不知道test_script.py中有哪些函数。如何将参数作为stdin输入传递?

test_script.py

a = int(input())
b = int(input())

print(a+b)

main_script.py

try:
  subprocess.check_output(['python', 'test_script.py', "2", "3"], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
  print(e.output)

错误

b'Traceback (most recent call last):\r\n File "test_script.py", line 1, in <module>\r\n a = int(input())\r\nEOFError: EOF when reading a line\r\n'

3 个答案:

答案 0 :(得分:1)

如果不想使用argv,但是很奇怪,请考虑Popen并在stdin / stdout上进行操作/通信

from subprocess import Popen, PIPE, STDOUT

p = Popen(['python', 'test_script.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

p_stdout = p.communicate(input=b'1\n2\n')[0]
# python 2
# p_stdout = p.communicate(input='1\n2\n')[0]
print(p_stdout.decode('utf-8').strip())
# python2
# print(p_stdout)

作为SO Python subprocess and user interaction的参考。

关于https://pymotw.com/2/subprocess/

的更多信息

答案 1 :(得分:-1)

不确定你想做什么,但这是一个有效的例子:

import sys

# print('Number of arguments:', len(sys.argv), 'arguments.')
# print('Argument List:', str(sys.argv))

# print(sys.argv[1])
# print(sys.argv[2])

a = int(sys.argv[1])
b = int(sys.argv[2])

print(a+b)

您的main_script.py

import subprocess

try:

  out = subprocess.check_output(['python', 'test_script.py', "2", "3"], stderr=subprocess.STDOUT)
  print(out)

except subprocess.CalledProcessError as e:
  print(e.output)

答案 2 :(得分:-1)

这就是jot开始工作, test_script.py 期望键盘输入而不是参数。

如果您希望 main_script.py 将参数传递给 test_script.py ,则必须修改 test_script.py 以下代码才能执行此操作

import sys

args = sys.argv[1:]
for arg in args:
    print arg

否则你可以chek argparse https://docs.python.org/2/library/argparse.html