2013-11-18 6 views
2

Я работал над этим в течение часа, это приводит в бешенство:Subprocess.Call терпит неудачу «Системе не удается найти указанный файл»

У меня есть exe-файл с именем манипулой, который принимает в качестве источника MSU- файл. Я могу успешно работать, что я хочу с помощью командной строки следующим образом:

"C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu" 

Однако, я не могу смоделировать поведение в Python-- независимо от того, что я использую. Я попытался os.system и subprocess.call и subprocess.Popen

Если я бегу что-то вроде следующего

p= subprocess.Popen("C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu", stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
for line in p.stdout.readlines(): 
print line, 
retval = p.wait() 

Я получаю сообщение об ошибке: The System Cannot Find the File Specified. Я тройной проверил, файл явно там, потому что она работает, когда я запустите командную строку.

Когда я добавляюв subprocess.Popen появляется новая ошибка, что нет директории C:/Flow, я думаю, потому что оболочка имеет трудные области обработки времени ... Я просто не знаю, что происходит.

Когда я делаю os.system("C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"), ничего не происходит.

Любые идеи?

ответ

4

Укажите программу и ее аргументы как список:

p = subprocess.Popen([ 
    "C:/Flow Check/Run Quick/Applications/Manipula.exe", 
    "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"], 
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

Пишущих строковые литералы последовательно объединяет строку:

>>> "abc" "xyz" 
'abcxyz' 
+0

Я думаю, что это что-то делает. Я вижу, что 'Manipula.exe' работает в фоновом режиме, но он просто висит бесконечно. Есть ли в любом случае, чтобы получить фактическую программу для всплывающего окна, как это происходит из командной строки? – Parseltongue

+0

@Parseltongue, есть ли сообщение в консоли? – falsetru

+0

Нет сообщений. – Parseltongue

4

Вы не проходящие в двух строках; вы проходите в один строка без пробелов между ними. Python автоматически присоединяет соседние строки с ничего, кроме пробела между ними:

>>> "C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu" 
'C:/Flow Check/Run Quick/Applications/Manipula.exeC:/Flow Check/Data Processing/BLAISE TO BLAISE.msu' 

Обратите внимание, как нет пространства между .exe и C:/Flow.

Положите две строки в списке:

p = subprocess.Popen(["C:/Flow Check/Run Quick/Applications/Manipula.exe", "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

Теперь Popen() будет обрабатывать переходящие в правильно процитированные строки в основной ОС в качестве одной команды.

+0

Благодарим вас за ответ. У вас и фальсетру есть практически одинаковые ответы, поэтому я сожалею, что должен принять только один. – Parseltongue

+2

Не проблема, это способ переполнения стека. Мы соревнуемся за то, чтобы получить наилучшие ответы. :-) –

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