关于python:Subprocess stdin输入

Subprocess stdin input

本问题已经有最佳答案,请猛点这里访问。

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

测试脚本

1
2
3
4
a = int(input())
b = int(input())

print(a+b)

主脚本

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

误差

1
2
3
4
5
6
7
8
9
b'Traceback (most recent call last):

 File"test_script.py", line 1, in <module>

 a = int(input())

EOFError: EOF when reading a line

'


如果不想使用argv,但是很奇怪,考虑popen和在stdin/stdout上操作/通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
2
'
)[0]
# python 2
# p_stdout = p.communicate(input='1
2
')[0]
print(p_stdout.decode('
utf-8').strip())
# python2
# print(p_stdout)

作为so python子进程和用户交互的参考。

更多关于https://pymotw.com/2/subprocess的信息/


这很简单,test_script.py需要的是键盘输入,而不是参数。

如果您想让main_script.py将参数传递给test_script.py,那么您必须修改下面的test_script.py代码,这样就可以了。

1
2
3
4
5
import sys

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

否则,可以检查argparse https://docs.python.org/2/library/argparse.html


不确定您要做什么,但这里有一个工作示例:

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
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)