Python和Tar命令shell = True

时间:2012-01-09 17:30:03

标签: python tar popen

我写了这个脚本来tar一些备份:

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命令添加add shell = True时,它可以工作:

subprocess.Popen(tar,shell=True)

但是我听说shell = True应该避免,因为它有时是不安全的(?)。

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

2 个答案:

答案 0 :(得分:8)

当shell = False时,您需要通过列表传递命令:

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上,shell = False(默认):在这种情况下,Popen类使用os.execvp()来执行子程序.args通常应该是一个序列。如果为args指定了一个字符串,它将被用作要执行的程序的名称或路径;这仅在程序没有参数时才有效。“ - http://docs.python.org/library/subprocess.html#popen-constructor

答案 1 :(得分:1)

@sgallen有一个基本正确的答案。但是作为补充说明:您可能还会发现指定“tar”命令的绝对路径很有用,例如: subprocess.Popen(['/usr/sbin/tar', ...]。当然,它所在的位置特定于您的Linux风格。