2012-01-09 46 views
2

我寫這個劇本焦油一些備份:Python和焦油命令shell =真

date = str(now.year)+str(now.month)+str(now.day) 
tar="tar -pczf "+date+"backup_lucas.tar.gz /home/lucas/backup/" 
subprocess.Popen(tar) 

但後來我得到:

File "test.py", line 21, in <module> 
    subprocess.Popen(tar) 
    File "/usr/lib/python2.6/subprocess.py", line 623, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

當我添加添加殼=真到了POPEN命令它作品:

subprocess.Popen(tar,shell=True) 

但是我聽說shell = True是要避免的,因爲它有時不安全(?)。

如何在不使用shell = True的情況下成功發出命令?

回答

6

當殼=假,你需要通過列表來傳遞你的命令:

date = str(now.year)+str(now.month)+str(now.day) 
filename = date + "backup_lucas.tar.gz" 
subprocess.Popen(['tar', '-pczf', filename, '/home/lucas/backup/']) 

編輯:重要組成部分,從文檔:

「在Unix上,殼= False(默認值):在這種情況下,Popen類使用os.execvp()來執行子程序,args通常應該是一個序列,如果爲args指定了一個字符串,它將被用作要執行的程序的名稱或路徑;只有在程序沒有提供參數的情況下才能使用。「 - http://docs.python.org/library/subprocess.html#popen-constructor

1

@sgallen有一個基本正確的答案。然而作爲附加說明:你也可能發現指定「tar」命令的絕對路徑很有用,例如, subprocess.Popen(['/usr/sbin/tar', ...]。當然,這些駐留在您的Linux風格中。