2010-11-30 81 views
0

什麼Python的子POPEN參數差異

subprocess.Popen(['cat','/path/to/file'], stdout=subprocess.PIPE, shell=True) 

subprocess.Popen(['cat '+'/path/to/file'], stdout=subprocess.PIPE, shell=True) 

之間的區別? 我在ipython中做這個。 對於第一個,ipython只是掛起。也許不會掛起,但速度要慢很多。 第二個就好。

只是不知道爲什麼。

回答

4

第一個實際上只運行cat(因爲如果您使用shell = True解析命令的方式),因此掛起,因爲它正在等待輸入。第二個是運行cat /path/to/file。您可以通過執行看到:

>>> subprocess.Popen(['ls', '-l']) 
<subprocess.Popen object at 0x10048bdd0> 
>>> total 8 
-rw------- 1 root  wheel 652 Nov 29 09:07 000d94cfc78b4 
srwxr-xr-x 1 nbastin wheel 0 Nov 29 09:06 ics179 
srwxr-xr-x 1 nbastin wheel 0 Nov 29 09:06 icssuis501 
drwx------ 3 nbastin wheel 102 Nov 29 09:06 launch-3ZniHd 
drwx------ 3 nbastin wheel 102 Nov 29 09:06 launch-8QRgz2 
drwx------ 3 nbastin wheel 102 Nov 29 09:06 launch-M5ppWp 
drwx------ 3 nbastin wheel 102 Nov 29 09:06 launchd-137.ztQAmI 
drwx------ 2 nbastin wheel 68 Nov 29 09:57 ssh-LreGlOZPAR 

,而使用shell = True做:

>>> subprocess.Popen(['ls', '-l'], shell = True) 
<subprocess.Popen object at 0x10048bd90> 
>>> 000d94cfc78b4  ics179   icssuis501  launch-3ZniHd  launch-8QRgz2  launch-M5ppWp  launchd-137.ztQAmI ssh-LreGlOZPAR 

如果設置shell = True,路過的列表爲args不會得到你想要的行爲 - 你需要傳遞一個字符串。

+0

所以,你的意思是第一個,列表中的第二個字符串被忽略? – wliao 2010-11-30 07:14:30

0

我測試的樣品,發現其第一工作返回在IPython的一個POPEN對象但第二做了同樣的但印刷cat: /path/to/file: No such file or directory

我喜歡可能當與shell=True避免使用subprocess.Popen並用一個列表['x', '--version']因爲這避免了需要引用路徑名與說'墳墓在他們或一些這樣的渣土

在補丁pymp.py我改變:

p = subprocess.Popen(['mplayer -slave -quiet \'' + target + '\' -include \'' + MPLAYERCONFFILE + '\' 2>/dev/null'], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

到:

devnull = open('/dev/null', 'w') 
p = subprocess.Popen(['mplayer', '-slave', '-quiet', target, '-include', MPLAYERCONFFILE], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=devnull)