2015-12-13 2 views
2

Я пытаюсь выполнить следующую команду подпроцесс с помощью python3.4Отправка конвейеру команды через Python3 подпроцесса

cd /home/mailer-domains/domain | rndc loadkeys domain 

Я попробовал множество методов с использованием .call и .Popen, но он либо не нравится моя труба или это не нравится мой переключатель

>>> subprocess.call(['cd /home/mailer-domains/'+domain, '|', 'rndc', 'loadkeys', domain])  
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/subprocess.py", line 537, in call 
    with Popen(*popenargs, **kwargs) as p: 
    File "/usr/local/lib/python3.4/subprocess.py", line 859, in __init__ 
    restore_signals, start_new_session) 
    File "/usr/local/lib/python3.4/subprocess.py", line 1457, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
FileNotFoundError: [Errno 2] No such file or directory: 'cd /home/mailer-domains/lecomm.com' 

>>> subprocess.call(['cd /home/ex-mailer-domains/'+domain, '&&', 'rndc', 'loadkeys', domain]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/subprocess.py", line 537, in call 
    with Popen(*popenargs, **kwargs) as p: 
    File "/usr/local/lib/python3.4/subprocess.py", line 859, in __init__ 
    restore_signals, start_new_session) 
    File "/usr/local/lib/python3.4/subprocess.py", line 1457, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
FileNotFoundError: [Errno 2] No such file or directory: 'cd /home/mailer-domains/lecomm.com' 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain, '&&', 'rndc', 'loadkeys', domain]) 
cd: too many arguments 
2 


>>> subprocess.Popen(['cd', '/home/mailer-domains/'+domain, '&&', 'rndc', 'loadkeys', domain])  
<subprocess.Popen object at 0x805aa5860> 
cd: too many arguments 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain] '&&' ['rndc', 'loadkeys', domain])  
    File "<stdin>", line 1 
    subprocess.call(['cd', '/home/mailer-domains/'+domain] '&&' ['rndc', 'loadkeys', domain]) 
                   ^
SyntaxError: invalid syntax 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain], '&&' ['rndc', 'loadkeys', domain]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain], ['rndc', 'loadkeys', domain])  
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/subprocess.py", line 537, in call 
    with Popen(*popenargs, **kwargs) as p: 
    File "/usr/local/lib/python3.4/subprocess.py", line 767, in __init__ 
    raise TypeError("bufsize must be an integer") 
TypeError: bufsize must be an integer 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain] ['rndc', 'loadkeys', domain]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not tuple 


>>> subprocess.call(['cd', '/home/mailer-domains/'+domain] +['rndc', 'loadkeys', domain]) 
cd: too many arguments 
2 


>>> ps = subprocess.Popen((['cd', '/home/mailer-domains/'+domain]), stdout = subprocess.PIPE)   
>>> output = subprocess.check_output((['rndc', 'loadkeys', domain]), stdin=ps.stdout) 
rndc: 'loadkeys' failed: not found 
no matching zone 'lecomm.com' in any view 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/subprocess.py", line 620, in check_output 
    raise CalledProcessError(retcode, process.args, output=output) 
subprocess.CalledProcessError: Command '['rndc', 'loadkeys', 'lecomm.com']' returned non-zero exit status 1 


>>> output = subprocess.check_output((['rndc', 'loadkeys', domain]), stdin=ps.stdout, stdout=PIPE) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'PIPE' is not defined 

Как правильно отправить 2 конвейеру команды через Python3 subprocess?

+0

Что вы пытаетесь достичь, пропустив вывод 'cd' (который обычно пуст) в процесс' rndc'? Вы действительно хотите запустить 'rndc' в новом каталоге? –

+0

@TomDalton Я предполагаю, что переключатель loadkey выглядит в текущем каталоге. Я видел какое-то странное поведение, которое указывало на это. У меня есть многочисленные каталоги зон, каждый со своими ключами. – doeJ

+0

хотя, я обдумываю себе, это звучит глупо. – doeJ

ответ

2

Ответ можно найти в subprocess documentation.

Функции модуля subprocess обычно не вызывают оболочку для интерпретации команд, а скорее обращаются к ним напрямую с заданными аргументами! Такое поведение может быть overidden с помощью аргумента shell=True (пример из документации Python):

output = check_output("dmesg | grep hda", shell=True) 

Однако это не рекомендуется, если команда и аргументы не исправить, но зависит от пользовательского ввода. Затем, правильный способ сделать это состоит в использовании двух Popen вызовов и построить трубопровод вручную (пример кода снова из документации Python):

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
+2

Трубы вообще не нужны. cwd может быть передан подпроцессу –

+0

@PadraicCunningham Согласовано в этом случае. Тем не менее, кто-то, кто ищет название этого вопроса, почти наверняка будет заинтересован в этом ответе. –

+1

Есть 1000 дураков, как трубить, это не тот подход, который нужно предпринять для OP, трубопровод, когда вы можете передать каталог, не имеет смысла –

3

Вам не нужны трубы вообще, просто пройти cwd в подпроцесс:

subprocess.call(['rndc', 'loadkeys', domain],cwd='/home/mailer-domains/'+domain) 

Если ты хотел изменить каталог для более чем просто подпроцесса, вы должны использовать os.chdir.

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