Как заархивировать все файлы с символом подстановки (*), используя подпроцесс - PullRequest
0 голосов
/ 09 сентября 2018

Это команда, которую я хочу запустить под python. В основном я хочу tar все файлы в папке:

tar -jcvf doo.tar.gz /home/user/doo/*

import subprocess

subprocess.run(['tar', '-jcvf', 'doo.tar.gz', '/home/user/doo/*'])

Возвращает следующую ошибку:

tar: Removing leading `/' from member names
tar: /home/user/doo/*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Позже я попробовал это, используя glob.

import subprocess,  glob
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])

Возвращает следующую ошибку:

Traceback (most recent call last):
  File "dd.py", line 4, in <module>
    subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])
  File "/usr/local/lib/python3.5/subprocess.py", line 693, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.5/subprocess.py", line 1490, in _execute_child
    restore_signals, start_new_session, preexec_fn)
TypeError: Can't convert 'list' object to str implicitly

Следующий подход работает, но я не уверен, как указывать все имена файлов как одно за другим:

import subprocess,  glob
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', 'hello.txt', 'world.txt'])

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Оболочка - это та, которая может расширяться *. Поэтому укажите shell=True в вызове вашего подпроцесса, чтобы развернуть его.

subprocess.run(['tar', '-jcvf', 'doo.tar.gz', '/home/user/doo/*'], shell=True)
0 голосов
/ 09 сентября 2018
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])

glob возвращает список строк. Вы не должны вставлять это в список, переданный run, а вместо этого добавлять его.

subprocess.run(['tar', '-jcvf', 'doo.tar.gz'] + glob.glob("*"))

Обратите внимание, что вы пропустили домашний каталог.

subprocess.run(['tar', '-jcvf', 'doo.tar.gz'] + glob.glob("/home/user/doo/*"))
...