2013-07-20 4 views
1

Я знаю, что этот вопрос задан много раз, и я думаю, что я прочитал их все, но мне не удалось найти ответ на мой вопрос. Я пытаюсь запустить исполняемый файл на машине Windows XP. Исполняемый файл находится в нескольких папках.Использование подпроцесса для запуска исполняемого файла с флагом

C:\folder\program.exe 

Когда я запускаю программу, мне нужно включить флаг и путь.

program -f\path\to\file.txt 

Если я перейду в папку и запустил команду выше, используя cli, она отлично работает. Я пытаюсь запустить эту программу из моего сценария python.

Я пробовал как Subprocess.popen, так и subprocess.call. Кажется, что у меня нет ошибок, но программа также не выполняется.

Есть ли у кого-нибудь предложения о том, что еще я могу попробовать? Thanks

def Run(Path='\data\file.txt'): 
    import subprocess, time 

    cmd = '-f'+Path 
    subprocess.Popen(["program", cmd, "C:\folder\\"]) 


def Run(Path='\data\file.txt'): 
     import subprocess, time 

     cmd = '-f'+Path 
     subprocess.call(["C:\folder\program.exe", cmd]) 
+1

ваша команда кли отличается от того, что вы делаете с 'subprocess.Popen'. у вас есть дополнительная часть команды в вашем popen. это будет «program -f \ data \ file.txt C: \ folder \\», в то время как ваша команда cli - это только первые два бита. – mavili

+0

Возможно, вас заинтересует модуль [sh] (http://amoffat.github.io/sh/) - прост в использовании, чем необработанный подпроцесс. –

+0

shell = True например: subprocess.call (["C: \ folder \ program.exe", cmd], shell = True) Использование промежуточной оболочки означает, что переменные, шаблоны глобусов и другие специальные функции оболочки в командная строка обрабатывается до запуска команды. http://pymotw.com/2/subprocess/index.html#module-subprocess – Prasath

ответ

3

Вы используете обратные косые черты в своих строках. Если вы не избежите их, он попытается интерпретировать обратную косую черту как escape-символы. Например, ваша неэкранированная строка:

>>> '\data\file.txt' 
'\\data\x0cile.txt' 

Обратите внимание, что \f получает превращена в другой характер. Это потому, что если вы посмотрите на table of escape characters, вы увидите, что \f отображает символ ASCII Formfeed (FF). Вы хотите, чтобы либо избежать их:

>>> '\\data\\file.txt' 
'\\data\\file.txt' 

или использовать буквенную строку:

>>> r'\data\file.txt' 
'\\data\\file.txt' 

Например, вот попытка переписать Run функцию:

import subprocess 
import time 

def Run(path='\\data\\file.txt'): 
    flag = '-f%s' % path 
    subprocess.call(['C:\\folder\\program', flag]) 

Вы должны всегда используйте абсолютный путь при вызове программы. Если у вас есть только путь относительно вашего скрипта, вы могли бы построить новый абсолютный путь с чем-то вроде этого:

import os.path 
script_dir = os.path.abspath(os.path.dirname(__file__)) 
cmd = os.path.join(script_dir, '\\relative\\path\\to\\program.exe') 
+0

Спасибо за быстрый ответ, я попробовал ваш ответ, и у меня все еще ничего нет. Я также заметил, что я могу запустить исполняемый файл из папки, но я не могу запустить его из другого места. Я добавил его в свою переменную PATH, и все же я не могу ее запустить. Может ли это быть проблемой? Спасибо – Drewdin

+0

Вы указали полный путь к программе? Если нет, вы должны установить аргумент 'cwd' в' subprocess.call', который сообщает ему, в какой каталог войти, прежде чем пытаться выполнить программу. – jterrace

+0

Добавлена ​​информация о пути к ответу. – jterrace

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