Командная оболочка Python и Tar = True - PullRequest
3 голосов
/ 09 января 2012

Я написал этот скрипт для некоторых резервных копий:

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

Когда я добавляю команду add shell = True в команду Popen, она работает:

subprocess.Popen(tar,shell=True)

Однако я слышал, что shell = True следует избегать, так как иногда он небезопасен (?).

Как я могу успешно выполнить команду без использования shell = True?

Ответы [ 2 ]

8 голосов
/ 09 января 2012

Когда 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 должны быть последовательностью. Если для аргументов указана строка, она будет использоваться в качестве имени или пути программы квыполнить; это будет работать только в том случае, если программе не дается никаких аргументов. "- http://docs.python.org/library/subprocess.html#popen-constructor

1 голос
/ 09 января 2012

@ sgallen имеет принципиально правильный ответ.Однако в качестве дополнительного примечания: вам также может быть полезно указать абсолютный путь к вашей команде «tar», например, subprocess.Popen(['/usr/sbin/tar', ...].Где это находится, конечно, зависит от вашего вкуса Linux.

...