2012-03-03 29 views
1

bash命令有沒有一種方法,我可以用Python擴展執行bash命令:*子過程與*

我試圖千差萬別,沒有運氣。

其實我想要一個python腳本which進入當前目錄中的每個目錄,並在那裏執行給定的bash命令(可能是一個帶有擴展的bash命令:*)。

+1

[Python命令行執行]的可能重複(http://stackoverflow.com/questions/7306178/python-command-line-execution) – 2012-03-03 16:19:12

+0

實際上很難告訴如何解決您的問題,而無需看到一些代碼。 – 2012-03-03 16:27:59

+0

@ IgnacioVazquez-Abrams:我不認爲這是重複的,因爲答案是一樣的。我們希望人們能夠搜索問題,而不是答案,對嗎? – 2012-03-03 17:04:57

回答

3
import os 
from subprocess import check_call 

cmd = 'echo *' # some shell command that may have `*` 
for dirname in filter(os.path.isdir, os.listdir(os.curdir)): 
    check_call(cmd, shell=True, cwd=dirname) 
  • filter(os.path.isdir, os.listdir(os.curdir))列表以點開始的當前目錄中包括的所有子目錄(.
  • shell=True執行給定的命令cmd穿過外殼的字符串。 *如果存在被shell像往常一樣
  • cwd=dirname告訴命令應該在dirname目錄執行擴展
+0

它的工作原理與我想要的完全一樣,但爲什麼在[python docs](http://docs.python.org/library/subprocess.html#subprocess.check_call)中沒有關於'check_call'的cwd' arg。 – Adobe 2012-03-05 14:06:54

+1

@Adobe:docs明確提到*「全功能簽名與[Popen構造函數](http://docs.python.org/library/subprocess.html#popen-constructor)相同 - 此函數通過所有提供的參數直接通過該接口。「* – jfs 2012-03-05 14:54:06

1

你也許有使用的glob module?

>>> import glob 
>>> glob.glob("*") 
['build', 'DLLs', 'Doc', 'ez_setup.py', 'foo-bar.py', 'include', 'Lib', 'libs','LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'Removesetuptools.exe', 'Scripts', 'selectitems.py', 'selectitems.pyc', 'setuptools-wininst.log', 'share', 'so_vector.py', 'tcl', 'Tools', 'w9xpopen.exe'] 
>>> 
+0

我知道glob,但我想給一個bash命令作爲python腳本的參數。 – Adobe 2012-03-05 14:01:04

1

既然你將不得不在shell中執行命令,讓殼做的擴展shell元字符。您可以運行:

sh -c "your_commaand -with *" 

shell將爲您處理globbing並執行命令。

這留下了遍歷當前目錄的子目錄的問題。必須有一個Python模塊來做到這一點。

如果你決定你的程序應該chdir()到子目錄,你必須小心處理每一個後回到起始目錄。另外,外殼可以處理,對你,也使用:

sh -c "cd relevant-subdir; your_command -with *" 

這就避免了問題,因爲外殼是一個單獨的進程切換目錄,而影響你的主要的Python程序。

+0

+1:它從來沒有發生過我 - 我可以把它餵給'bash -c'。 – Adobe 2012-03-05 14:04:28