2013-07-26 83 views
7

我試圖用子調用執行復制操作(下面的代碼):使用「CP」 Python的子進程錯誤

import subprocess 
pr1 = subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = True) 

,我得到了一個錯誤說:

cp: missing file operand 

Try `cp --help' for more information. 

當我嘗試用shell=False,我得到

cp: cannot stat `./testdir1/*': No such file or directory 

我該如何解決這個問題得到什麼?

我使用RedHat Linux上的GNOME Deskop版本2.16.0和bash外殼和Python 2.6

附:我讀張貼在Problems with issuing cp command with Popen in Python的問題,它使用shell = True選項,正如我所說:(

回答

12

當使用shell=True這是不是爲我工作的建議,傳遞一個字符串,而不是一個列表subprocess.call

subprocess.call('cp -r ./testdir1/* ./testdir2/', shell=True) 

The docs say:。

在Unix與殼=真,殼默認爲/ bin/sh的如果ARGS是 字符串,該字符串指定通過殼來執行命令 這意味着字符串的格式必須與在shell提示符下鍵入時的 完全相同。這包括,例如,在其中包含空格的引號或 反斜槓轉義文件名。如果參數是 序列,則第一項指定命令字符串,並且任何其他項目將被視爲殼體 本身的附加參數。

所以(在Unix)中,當一個列表被傳遞到subprocess.Popen(或subprocess.call),列表的第一個元素被解釋爲命令,在列表中的所有其它元件都被解釋爲自變量爲外殼。因爲在你的情況下,你不需要傳遞參數到shell,你可以傳遞一個字符串作爲第一個參數。

2

這是一個古老的線程,但我只是有同樣的問題。

給您的通話中遇到的問題:

subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = False) 

是每個後的第一個參數被引用。所以到shell看到像這樣的命令:

cp '-r' './testdir1/*' './testdir2/' 

有這個問題是通配符(*)。文件系統在testdir1目錄中查找文字名爲'*'的文件,當然這不在那裏。

解決方法是使用shell = True選項使所有呼叫像選定的答案一樣,並且不引用任何參數。

+0

很好的解釋。幫助我瞭解發生了什麼事。 – morganw09dev