2012-09-27 91 views
0

我想通過Python的子進程運行一個命令,但它不會正常運行。如果我鍵入到外殼:Python子進程:命令在Python中失敗,但在shell中工作

pack < packfile.dat 

其中pack是我的軟件和packfile是輸入文件,則該軟件運行良好。

如果我試試這個在python:

import subprocess as sp 
import shlex 

cmd = 'pack < packfile.dat'.split() 
p = sp.Popen(cmd) 

軟件抱怨:

Pack must be run with: pack < inputfile.inp 

Reading input file... (Control-C aborts) 

,它掛在那兒。

最後一部分是針對我的軟件的,但事實是運行相同命令的兩種方法會產生不同的結果,但情況並非如此。

誰能告訴我我做錯了什麼?

其實,我打算做最後:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE) 
stdout, stderr = p.communicate() 

因爲我有點新本,這是不是最好的做法,請讓我知道。

在此先感謝。

回答

1

「<」不是命令參數,並且不應該被作爲一個傳遞。

嘗試:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE, stdin=open('packfile.dat')) 
+0

謝謝! (提供答案和解釋) – Tetsuo

4

I/O重定向是shell的產品,默認情況下Popen不使用它。試試這個:

p = sp.Popen(cmd, shell=True) 

subprocess.Popen() IO redirect

從那裏,你還可以看到,有些不情願的shell選項。在這種情況下,你很可能與完成它:

with open('input.txt', 'r') as input: 
    p = subprocess.Popen('./server.py', stdin=input) 
+0

感謝您的快速回復,我很感激。我嘗試了shell = True,但這不幸沒有奏效。根據其他答案,「<」不能以這種方式使用。 – Tetsuo

1

試試這個:

import subprocess as sp 
p = sp.Popen(['pack'], stdin = open('packfile.dat', 'r')) 
+0

謝謝!這非常有幫助! – Tetsuo

相關問題