subprocess.Popen(['cat','/path/to/file'], stdout=subprocess.PIPE, shell=True)
和
subprocess.Popen(['cat '+'/path/to/file'], stdout=subprocess.PIPE, shell=True)
之間的區別? 我在ipython中做這個。 對於第一個,ipython只是掛起。也許不會掛起,但速度要慢很多。 第二個就好。
只是不知道爲什麼。
subprocess.Popen(['cat','/path/to/file'], stdout=subprocess.PIPE, shell=True)
和
subprocess.Popen(['cat '+'/path/to/file'], stdout=subprocess.PIPE, shell=True)
之間的區別? 我在ipython中做這個。 對於第一個,ipython只是掛起。也許不會掛起,但速度要慢很多。 第二個就好。
只是不知道爲什麼。
第一個實際上只運行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
不會得到你想要的行爲 - 你需要傳遞一個字符串。
我測試的樣品,發現其第一工作返回在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)
所以,你的意思是第一個,列表中的第二個字符串被忽略? – wliao 2010-11-30 07:14:30