2016-09-30 31 views
2

首先,我知道有更好的方法來做到這一點。我試圖在與各種UNIX命令交互時學習subprocess.Popen()的最基本行爲。我在做目錄導航時遇到了一些問題,我不知道它是什麼。我將iPython作爲我的REPL運行,所以ls命令顯示當前工作目錄中的文件。需要使用python子進程模塊導航Linux目錄的幫助

有人請告訴我我做錯了什麼!

In [61]: newtree_dirs 
Out[61]: 
['10dir', 
'1dir', 
'2dir', 
'3dir', 
'4dir', 
'5dir', 
'6dir', 
'7dir', 
'8dir', 
'9dir'] 

In [62]: ls 
10dir/ 1dir/ 2dir/ 3dir/ 4dir/ 5dir/ 6dir/ 7dir/ 8dir/ 9dir/ 

In [63]: for folder in newtree_dirs: 
    ...:  p1 = sub.Popen(['cd', './{}'.format(folder)]) 
    ...:  p1.communicate() 
    ...:  foo = (i for i in xrange(10)) 
    ...:  for num in foo: 
    ...:   p2 = sub.Popen(['touch', '{}file'.format(num)]) 
    ...:   p2.communicate() 
    ...:  p3 = sub.Popen(['cd', '..']) 
    ...:  p3.communicate() 
    ...: 
    ...: 
--------------------------------------------------------------------------- 
OSError         Traceback (most recent call last) 
<ipython-input-63-bb6e77faf97b> in <module>() 
     1 for folder in newtree_dirs: 
----> 2  p1 = sub.Popen(['cd', u'./{}'.format(folder)]) 
     3  p1.communicate() 
     4  bar = (i for i in xrange(10)) 
     5  for num in bar: 

該異常後,進一步的異常下降到子模塊的錯誤處理缺少目錄。我的cwd中的目錄名稱是相同的,我不知道發生了什麼。

+0

究竟是什麼錯誤信息?試着對單個Popen(cd)命令進行硬編碼,看看它是否能自行工作,而不是循環。 –

+0

您收到的錯誤是否如下所示:「OSError:[Errno 2]沒有這樣的**文件**或目錄」? –

回答

1

sub.Popen(['cd', './10dir')提出了「OSERROR:[錯誤2]沒有此類文件或目錄」,是因爲有一個名爲上cd沒有這樣的文件你$PATH(也可能是您的計算機上的話)。 cd不是一個獨立的可執行文件,它是一個內置的shell。如果它是一個獨立的可執行文件,它將無法改變shell的當前工作目錄(或者你的腳本),因爲子進程不能直接改變其父目前的工作目錄,環境變量,用戶ID等

更多信息:
builtin vs normal command

注:從技術上講是除了內置cd殼POSIX complient的操作系統必須提供一個獨立的可執行文件cd改變它自己的當前目錄並返回,但許多Linux發行版不包含它。來源:Why is cd not a program?

+0

所以我試着用更多的內建函數試試這個,從那些試驗中看來你是對的。 subprocess.Popen(['pwd'])再次彈出'no such file or directory'異常。看起來我必須用一些os模塊函數來擴充子進程來模擬shell內建函數。 –