无法在子进程中写入标准输入

我无法将命令传递给python 3.2.5中的stdin。我有以下2个尝试也接近:这个问题是一个的延续前面的问题。


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()

但没有运气。


阿波罗的战车
浏览 220回答 2
2回答

小怪兽爱吃肉

shell=True将参数作为列表传递时不要使用。stdin.write需要一个bytes对象作为参数。您尝试连线str。communicate()写入输入到stdin并返回的otput的元组stdout和sterr,并且它等待直到过程完成。您只能使用一次,尝试再次调用它将导致错误。您确定您要编写的行应该传递到stdin上的进程中吗?这不是您要尝试运行的命令吗?

www说

将命令参数作为参数传递,而不作为stdin传递该命令可能直接从控制台读取用户名/密码,而无需使用子进程的stdin。在这种情况下,您可能需要winpexpect或SendKeys模块。参见我对具有相应代码示例的类似问题的回答这是一个示例,该示例如何使用参数启动子流程,传递一些输入并将合并的子流程的stdout / stderr写入文件:#!/usr/bin/env python3import osfrom subprocess import Popen, PIPE, STDOUTcommand = r'fileLoc\uploader.exe -i file.txt -d outputFolder'# use str on Windowsinput_bytes = os.linesep.join(["username@email.com", "password"]).encode("ascii")with open('command_output.txt', 'wb') as outfile:&nbsp; &nbsp; with Popen(command, stdin=PIPE, stdout=outfile, stderr=STDOUT) as p:&nbsp; &nbsp; &nbsp; &nbsp; p.communicate(input_bytes)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python