2012-01-09 11 views
2

私はいくつかのバックアップをタールこのスクリプトを書いた:それはpopenのコマンドに真=Pythonとtarコマンドシェル= Trueの

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 

私はシェルを追加する場合:

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

しかし、私は取得作品:

しかし、時には安全ではないので、シェル= Trueは避けなければならないと聞きました(?)。

shell = Trueを使用せずにコマンドを正常に発行するにはどうすればよいですか?

答えて

6

シェルは= Falseのリスト経由でコマンドを渡す必要がある場合:シェル=偽(デフォルト)で、

「UNIXの場合:

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

編集:ドキュメントからの重要な部分:この場合、Popenクラスはos.execvp()を使用して子プログラムを実行します。通常、argsはシーケンスでなければなりません。argsに文字列が指定されている場合、実行するプログラムの名前またはパスとして使用されますプログラムに引数が与えられていない場合にのみ機能します。 - http://docs.python.org/library/subprocess.html#popen-constructor

1

@sgallenは基本的に正解です。ただし、 "tar"コマンドの絶対パスを指定すると便利です。 subprocess.Popen(['/usr/sbin/tar', ...]。その場所は、もちろん、あなたのLinuxの味に特有のものです。

関連する問題