2015-12-04 3 views
1

У меня есть скрипт python, который вызывает perl-скрипт, используя модуль подпроцесса.Передача аргумента командной строки в модуль подпроцесса

В терминале я запустить скрипт на языке Perl, как этого

perl email.pl [email protected] 

я передаю в [email protected] в качестве аргумента командной строки для этого сценария

Это мой Python скрипт

import subprocess 

pipe = subprocess.Popen(["perl","./email.pl"]) 
print pipe 

Это нормально работает

Но если я передаю аргументы, это файл не найден

import subprocess 

pipe = subprocess.Popen(["perl","./email.pl moun"]) 
print pipe 

ошибка:

<subprocess.Popen object at 0x7ff7854d6550> 
Can't open perl script "./email.pl moun": No such file or directory 

Как я мог передать аргументы командной строки в этом случае?

+1

'[" perl "," ./ email.pl "," moun "]' – eph

+0

@eph Это работает, вы можете добавить это как ответ? – Mounarajan

ответ

1

Команда может быть строкой:

pipe = subprocess.Popen("perl ./email.pl moun") 

или список:

pipe = subprocess.Popen(["perl", "./email.pl", "moun"]) 

Когда это список, Python будет экранировать специальные символы. Так что, когда вы говорите

pipe = subprocess.Popen(["perl","./email.pl moun"]) 

Он называет

perl "./email.pl moun" 

Но файл "email.pl Moun" не существует.

Выше грубое объяснение и работает только в Windows. Подробнее см. Комментарий @ShadowRanger.

+3

Решение (второй блок кода) является правильным, но объяснение только слабо применимо к системам Windows и что-то не так. В системах, отличных от Windows, Python не ускользает от объекта в вызове 'list' (он преобразуется в массив уровней C строк стиля C и передает его непосредственно системному вызову' execvp' после 'fork'). Первый блок кода не является законным без передачи 'shell = True' в системах, отличных от Windows. Даже в системах Windows вызов 'list' обычно безопаснее, потому что Python лучше справляется с необходимым экранированием для создания командной строки. – ShadowRanger

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