2012-05-01 48 views
1

我想調用一個子進程來備份mysql數據庫。 ,其在終端運行良好(和創建名爲mydatabase.sql文件)的命令行是:Python - subprocess.check_call給出了一個CalledProcessError異常

mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql 

現在代碼由蟒跑出調用子流程:

args = shlex.split('mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql') 
    subprocess.check_call(args) 

的exeption提高(沒有文件創建):

Traceback (most recent call last): 
     File "<pyshell#29>", line 1, in <module> 
     subprocess.check_call(args) 
     File "/usr/lib/python3.2/subprocess.py", line 485, in check_call 
     raise CalledProcessError(retcode, cmd) 
    subprocess.CalledProcessError: Command '['mysqldump', >'-uroot', '-ppassword', '--add-drop-database', '--database', >'mydatabase', '>', 'mydatabase.sql']' returned non-zero exit status 2 

我嘗試了多種不同的方式,但他們仍然不工作:

args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql') 
    subprocess.check_call(args) 

args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql') 
    subprocess.Popen(args) 

我也試圖與殼= True或或shell =假。在這兩種情況下,他們仍然無法工作。

我已閱讀文檔,谷歌爲我的問題的答案,但我還沒有一個線索如何顯示我的問題。 stackoverflow可能是我最後的希望。

回答

2

這裏的問題是你重定向輸出的方式。

  • 如果你通過命令的參數列表,然後">"將始終被解釋爲字面>,如果使用shell=Trueshell=False
  • 如果傳遞的命令作爲一個字符串不管,然後它可以工作,但只有你有shell=True
  • 你做你想做的是將輸出直接從蟒蛇重定向到文件的最好方法:

    args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase') 
    output = open("mydatabase.sql", "w") 
    subprocess.Popen(args, stdout=output) 
    
+0

非常感謝!我想給你的答案一個加號,但我需要更多的代表。 –

1

問題可能是shell重定向。如果您使用shell=True運行,請不要使用shlex.split。換句話說,嘗試:

args = '/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql' 
subprocess.Popen(args,shell=True) 

當然,更安全的解決辦法是去掉外殼重定向,對參數使用shlex.split(不shell=True),並使用subprocess.PIPE捕獲輸出(你可以然後發送到一個文件或程序做任何你想要的)

例如:

args = '/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase' 
p=psubprocess.Popen(shlex.split(args),shell=False,stdout=subprocess.PIPE) 
p.wait() 
returnvalue=p.returncode 
data=p.stdout.read() 
with open('mydatabase.sql','w') as f: 
    f.write(data) 

... 

如果你不想做在你的程序中的數據什麼,你可以做重定向更容易一點as described by mata

+0

非常感謝您!我想給你的答案一個加號,但我需要更多的代表。 –

相關問題