2013-07-11 41 views
2

我想在我的python腳本中做一個目錄結構的遞歸副本。當我通過bash命令行做副本:爲什麼python的遞歸副本與命令行不一樣?

[email protected]:~/head$ cp -rf ./applications/app_template/ ./applications/my_dir 

我得到預期的結果:

[email protected]:~/head$ tree ./applications/my_dir/ 
./applications/my_dir/ 
├── cdl 
│ ├── include 
│ ├── Makefile 
│ ... 
│ └── other 
├── cds 
│ ├── include 
... 

然而,當我試着通過Python腳本做同樣的事情:

print "./applications/"+tar_dir 
os.system("cp -rf ./applications/app_template/ ./applications/"+tar_dir)  

我得到:

[email protected]:~/head$ tree ./applications/my_dir/ 
./applications/my_dir/ 
└── app_template   <--- why did it copy that too? 
    ├── cdl 
    │ ├── include 
    │ ├── Makefile 
    │ ... 
    │ └── other 
    ├── cds 
    │ ├── include 
    ... 

我的python腳本的打印正顯示出我,我使用的是同一個目標:

./applications/my_dir 

而且你可以看到我的命令的其餘部分是相同的。那麼,爲什麼我在使用os.system()時得到的輸出與我直接從shell運行命令時的輸出不同?

+0

也許'os.​​system'使用的是與您使用的shell不同的shell。也許這個問題可以通過使用'subprocess'來解決,你可以在其中指定使用哪個shell – inspectorG4dget

+0

@ inspectorG4dget - 一個有趣的想法...你知道我該如何檢查os.system調用到底在做什麼? – Mike

+0

嘗試os.system(「echo $ 0」) –

回答

0

似乎os.system改變它執行殼中sh

[email protected]:~/head$ echo $0 
bash 

[email protected]:~/head$ python 
Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
>>> import os 
>>> os.system("echo $0") 
sh 

當經由POPEN與bash外殼執行復制命令時,它按預期方式工作:

>>> import subprocess 
>>> sp.Popen("cp -rf ./applications/icom_app_template ./applications/my_dir", 
       shell=True, executable="/bin/bash") 
>>> exit() 
[email protected]:~/head$ tree ./applications/my_dir/ 
./applications/my_dir/ 
├── cdl 
│ ├── include 
│ ├── Makefile 
│ ... 
│ └── other 
├── cds 
│ ├── include 
... 

唯一古怪我沒有答案是,如果我在命令行(Python外部)切換到sh shell並執行相同的cp命令,它將在不復制父「templa te「目錄。奇怪......但切換到Popen和強制bash外殼似乎解決了我的問題。

相關問題