2011-09-26 120 views
1

我有下面的代碼,我正在使用它來檢查程序類轉儲是否存在於系統上。該程序只返回一個空白。Python中的等價命令

cmd = ["which","class-dump"] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
print process.stdout.read() 

此代碼始終返回空格。從技術上講,它應該正確嗎?

+1

不'其中類dump'產生在命令行上一個非空輸出? –

+0

否,它返回類轉儲的路徑。我想通過代碼本身獲得路徑。 – Amritha

回答

0

嗯,它看起來像類轉儲不存在(在你的Python解釋器使用的PATH)

+0

我不明白。子進程調用實際上應該如何在終端中調用該命令?它在終端中工作正常,但從python運行時保持空白。 – Amritha

+1

@Amritha:'which'所尋找的路徑是「當前」PATH的內容,在你的情況下,你的shell中的PATH可能是正確的,但不是你的python解釋器中使用的PATH變量。正如Tempos所說,轉儲你的os.environ [「PATH」]來確認 –

+0

好吧,我現在明白了錯誤。 shell指向一個不同的路徑,並且類轉儲不在那裏。如何更改環境路徑?有沒有辦法做到這一點 ? – Amritha

0

請問,如果你使用communicate,而不是它的工作?看到這個警告:

警告

使用通信(),而不是.stdin.write,.stdout.read或 .stderr.read避免死鎖由於任何其他操作系統管 緩衝區填充啓動並阻止子進程。

此外,您的腳本可能會在另一個PATH下運行嗎?轉儲os.environ["PATH"]並檢查。

+1

只有在使用兩個方向的情況下,此警告纔有效。我會懷疑PATH的東西... – glglgl

+0

好吧,我現在明白了錯誤。 shell指向一個不同的路徑,並且類轉儲不在那裏。如何更改環境路徑?有沒有辦法做到這一點 ? – Amritha

1

which是內置的外殼。您需要將shell=True傳遞給Popen。

+0

即使添加了shell = True,仍然會打印空白 – Amritha

+1

@rplnt:'which'是真實文件(/ usr/bin/which)的別名,如果python無法找到哪個可執行文件,它會引發例外。 –

+0

@Cédric感謝您的糾正。不確定,目前沒有任何* nix機器在我面前。所以我只是搜索內置的列表,並在那裏。 – rplnt

3

我在我的機器上嘗試了以下操作,並且完美地工作。

import subprocess 
cmd = ["which","java"] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
print process.communicate() 

這是輸出

('/usr/bin/java\n', None) 
0

此代碼做同樣的事情作爲外殼which命令編程,但它並沒有「找到」的符號鏈接。爲了支持這一點,你可以增強isx函數。

import os.path, itertools 
isx = lambda program: lambda folder: (lambda p: \ 
    os.access(p, os.X_OK) and os.path.isfile(p))(os.path.join(folder, program)) 

def which(program): 
    try: 
    return itertools.ifilter(isx(program), os.environ['PATH'].split(':')).next() 
    except StopIteration: 
    raise ValueError, 'no executable file named %s found in search path' % (program,) 

實施例使用:

>>> which('ls') 
'/bin' 
>>> which('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in which 
ValueError: no executable file named foo found in search path