Альтернатива библиотеке команд в Python 2.7 и 3.6

В вашей команде есть несколько проблем.

Первая - сжатый архив не может быть обновлен. Вам нужно сначала создать несжатый архив, обновить его и, наконец, сжать.

Вторая - синтаксис tar неверен, первый пункт -exec должен использовать либо +, либо \;, но не оба.

Третий вариант более тонкий и возникает, если оставить терминатор +, то второе предложение -exec будет выполняться для каждого файла по порядку, пока первое будет ждать, пока список файлов для сохранения заполнит строку окружения для запуска. Когда это произойдет, все файлы, которые будут сохранены первым -exec, уже будут удалены вторым -exec, поэтому tar завершится неудачно, и вы потеряете все свои файлы.

Поскольку нет сомнений, что вы используете GNU tar, вот простой способ добиться желаемого:

tar --files-from <(find . \( -name "*.c" -o -name "*.sh*" \)) \
    --remove-files -cjf mycompress.bz2.tar

GNU tar документирован так, что удаляет файлы только после их сохранения:

$ man gtar
...
       --remove-files
              remove files after adding them to the archive
...

Обратите внимание, что предложенная мной команда не сможет обработать файлы со встроенной новой строкой, но это должно быть довольно маловероятным событием.

1
09.03.2019, 15:40
3 ответа

commandsestá en desuso y debe reemplazarse con llamadas subprocess. Un reemplazo para commands.getoutput()essubprocess.Popen().communicate():

import subprocess
import shlex


command = shlex.split('/bin/ls -l -a -h')
process = subprocess.Popen(command, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

banditprobablemente seguirá generando un problema de baja gravedad porque todavía usa subprocess, que no es seguro en sí mismo como cualquier cosa que invoque un shell, pero esto es inevitable. Vea la advertencia restante como un recordatorio sobre una posible inseguridad en su código -dependiendo de lo que realmente esté llamando en un shell, debe hacer la verificación usted mismo -¿es un comando codificado en una constante de cadena, o un entrada del usuario, o algo variable dependiendo del código de llamada? En cualquier caso, siempre se aconseja hacer la higienización,Python tiene el módulopipespara eso.

1
28.04.2021, 23:47

La forma "estándar" sería subprocess, según la respuesta de Hoefling, pero hay algunas formas más modernas disponibles si no le importa usar bibliotecas externas.

enviado ha sido desaprobado por delegador y así es como se ve:

In [1]: import delegator

In [2]: print delegator.run('pwd').out
/home/vince

Lo instalé con:

pip install git+https://github.com/kennethreitz/delegator.py.git@v0.1.0
1
28.04.2021, 23:47
import subprocess

commands = subprocess

Оставьте оставшийся код таким же, он будет работать как есть

0
28.04.2021, 23:47

Теги

Похожие вопросы