2017-01-10 2 views
1

Я пытаюсь выполнить эту команду с помощью Python:Как выполнять сложные команды python с использованием подпроцесса с использованием относительной ссылки?

findSyntax = "find . -maxdepth 2 -name '.config' | cpio -updm ../test1/" 
subprocess.Popen(findSyntax.split(' ')) 

Но эта команда просто не будет работать. Когда я запустил эту команду, он начнет перечислять все файлы (а не только .config) под. каталог за пределами maxdepth 2 ... который является длинным списком.

Что мне здесь не хватает! Может кто-нибудь это указать? Благодарю.

ПРИМЕЧАНИЕ. Я попытался запустить subProcess.run, а также с теми же результатами. Я смог получить только часть поиска, используя команду os.system().

EDIT: Я просто хотел уточнить, что эта команда скопирует найденные файлы с точной структурой каталогов в новое место (при необходимости создав подкаталоги). Я пробовал эту команду на терминале bash, и он отлично работает. Но я не мог заставить его работать с Python.

EDIT2: Таким образом, вся команда работает с os.system(), но я не мог понять, как заставить его работать с subprocess. os.system() должен быть устаревшим, поэтому мне было бы очень интересно выяснить решение, используя вместо этого subprocess.

+0

Вы должны сказать, чего вы ожидаете, вместо этого. –

+0

Вы должны разбирать вещи. Сначала убедитесь, что ваша находка «находит» то, что вы ожидаете от нее, - когда вы запускаете ее вручную из командной строки! Затем: вы можете использовать модуль shlex вместо того, чтобы просто разделить вашу команду. – GhostCat

+0

@GhostCat, я отредактировал вопрос с некоторыми деталями. Команда отлично работает на оболочке. Я не знаю о его модуле shlex, но я это сделаю. – rrlamichhane

ответ

1

Пожалуйста, посмотрите на this good answer и this also helps

Но в сущности, вы не можете использовать вышеупомянутую команду подпроцесс с трубой.

Позволяет работать через простой пример получения всех py файлов в текущем каталоге: (ls | grep py)
Это сломана:

import subprocess 
subprocess.call(['ls', '|', 'grep', 'py']) 

Поскольку подпроцесс выполняет только один процесс в то время, и по конвейеру вас действительно создают 2 процесса.

Простой, но ограниченный (на платформу) способ заключается в использовании os.system

import os 
os.system('ls | grep py') 

Это буквально передает команду оболочки к системе для выполнения.

Однако, вы должны делать это с подпроцесса, определив ваши трубы:

# Get all files and pass the stdout to a pipe 
p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) 
# then pass that pipe to another process as stdin and do part 2 
output = subprocess.check_output(['grep', 'py'], stdin=p1.stdout) 
print(output) 

Так, копия пасты для примера:

import subprocess 
p1 = subprocess.Popen("find . -maxdepth 2 -name '.config'".split(), stdout=subprocess.PIPE) 
output = subprocess.check_output("cpio -updm ../test1/".split(), stdin=p1.stdout) 

Или с os:

os.system("find . -maxdepth 2 -name '.config' | cpio -updm ../test1/") 
+0

спасибо за ответ. Я попробовал ваш пример, но он тоже не работал. Я попытался отладить, просмотрев данные stdout, как описано [здесь] (http://stackoverflow.com/questions/17411966/printing-stdout-in-realtime-from-a-subprocess-that-requires-stdin), и это только напечатанный 'b'''. Я не уверен, что здесь происходит. – rrlamichhane

+1

Вы пробовали использовать команду 'os.system (" find. -maxdepth 2 -name '.config' | cpio -updm ../ test1/")'? – Roman

+0

@rrlamichhane О, я подозреваю, что, возможно, ваши пути не правы. Вместо поиска в вашем текущем (сценарии python) пути '.', введите абсолютный путь. – Roman

Смежные вопросы