2013-06-26 87 views
0

我無法將命令傳遞到python 3.2.5中的stdin。我嘗試了以下兩種方法 另外:此問題是previous question的延續。無法寫入到子進程中的stdin

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

我也得到的數字,如96,0,85退還給我,當我嘗試在IDLE解釋器的代碼,與錯誤,如從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() 

但沒有運氣。

回答

0
  • 傳遞參數列表時不使用shell=True
  • stdin.write需要一個bytes對象作爲參數。您嘗試連線str
  • communicate()將輸入寫入stdin並返回輸出爲stdoutsterr的元組,並等待處理完成。您只能使用一次,試圖再次調用它會導致錯誤。
  • 是你確定你寫的行應該傳遞給你的過程stdin?它不應該是你試圖運行的命令嗎?
+0

1.外殼=真解決 2。 stdin.write:我以前解決了這個問題,但我忘了寫在這裏,所以現在我有字節(r'command','UTF-8') – Rohit

+0

3.溝通()是什麼給了我最大的問題,我繼續收到IOError:[Errno 22]無效的參數錯誤。我只調用它一次,我使用的格式如下: 輸出= p.communicate(輸入='任何輸入是')[0] 即使我寫:print(p.communicate()[ 0])它仍然給我IOError:[Errno 22]無效參數錯誤 – Rohit

+0

4.它是一個命令我試圖運行,所以我試過 p = Popen([r'fileLoc/uploader.exe','command' ],stdout = PIPE,stdin = PIPE,stderr = STDOUT)和p = Popen([r'fileLoc/uploader.exe'],stdout = PIPE,stdin = PIPE,stderr = STDOUT),當我做p.stdout。 readlines()我得到了相同的登錄信息 – Rohit

0
  1. 傳遞命令的參數作爲參數,而不是標準輸入
  2. 該命令可能的情況下直接使用子標準輸入讀取從控制檯的用戶名/密碼。在這種情況下,您可能需要winpexpectSendKeys模塊。見my answer to a similar quesiton that has corresponding code examples

下面是一個例子如何使用參數啓動一個子進程,通過一些輸入,並寫入合併子標準輸出/標準錯誤到一個文件:

#!/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(["[email protected]", "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) 
+0

塞巴斯蒂安,我試圖運行,似乎凍結程序給他們的數據,他們就不能很好地工作。 – Rohit

+0

@Rohit:這可能是等待輸入。爲了測試它,不要重定向stdout和看它是否停止(凍結)在提示(用戶名,密碼等)。 – jfs

+0

亞我嘗試沒有標準輸出= OUTFILE,它似乎仍然被凍結。我認爲這是與開始我的意思,如果沒有重定向,你應該能夠看到子輸出的程序本身 – Rohit