0

我无法在 python 3.2.5 中将命令传递给标准输入。我尝试了以下两种方法 另外:这个问题是上一个问题的延续

from subprocess import Popen, PIPE, STDOUT
import time

p = Popen([r'fileLoc/uploader.exe'],shell = True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
p.stdin.write('uploader -i file.txt -d outputFolder\n')
print (p.communicate()[0])
p.stdin.close()

当我在 IDLE 解释器中尝试代码时,我还会收到诸如 96、0、85 之类的数字,以及诸如来自print (p.communicate()[0])

Traceback (most recent call last):
  File "<pyshell#132>", line 1, in <module>
    p.communicate()[0]
  File "C:\Python32\lib\subprocess.py", line 832, in communicate
    return self._communicate(input)
  File "C:\Python32\lib\subprocess.py", line 1060, in _communicate
    self.stdin.close()
IOError: [Errno 22] Invalid argument

我也用过:

from subprocess import Popen, PIPE, STDOUT
    import time

    p = Popen([r'fileLoc/uploader.exe'],shell = True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    p.communicate(input= bytes(r'uploader -i file.txt -d outputFolder\n','UTF-8'))[0]
    print (p.communicate()[0])
    p.stdin.close()

但没有运气。

4

2 回答 2

0
  • shell=True将参数作为列表传递时不要使用。
  • stdin.write需要一个bytes对象作为参数。您尝试连接一个str.
  • communicate()将输入写入stdin并返回一个带有 and 输出的元组stdoutsterr它一直等到该过程完成。只能使用一次,再次调用会报错。
  • 你确定你写的那行应该被传递给你在标准输入上的进程吗?不应该是您要运行的命令吗?
于 2013-06-26T20:27:52.493 回答
0
  1. 将命令参数作为参数传递,而不是作为标准输入
  2. 该命令可能会直接从控制台读取用户名/密码,而不使用子进程的标准输入。在这种情况下,您可能需要winpexpectSendKeys模块。请参阅我对具有相应代码示例的类似问题的回答

这是一个示例,如何使用参数启动子进程,传递一些输入,并将合并的子进程的 stdout/stderr 写入文件:

#!/usr/bin/env python3
import os
from subprocess import Popen, PIPE, STDOUT

command = r'fileLoc\uploader.exe -i file.txt -d outputFolder'# use str on Windows
input_bytes = os.linesep.join(["username@email.com", "password"]).encode("ascii")
with open('command_output.txt', 'wb') as outfile:
    with Popen(command, stdin=PIPE, stdout=outfile, stderr=STDOUT) as p:
        p.communicate(input_bytes)
于 2013-06-27T01:25:18.233 回答