Запуск внешней программы (исполняемый файл) в Python?
Я только начал работать на Python, и я пытался запустить внешний исполняемый файл из Python.
у меня есть исполняемый файл для программы, написанной на Фортране. Допустим, имя исполняемого файла-flow.исполняемый. И мой исполняемый файл находится в C:Documents and Settingsflow_model. Я попробовал обе ОС.система и команды popen, но до сих пор я не мог заставить ее работать. Следующий код, похоже, открывает окно команд, но он не будет выполнять модель.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
Как я могу исправить это?
12 ответов:
эти пробелы действительно могут быть проблемой: - (. Попробуй
os.chdir('C:/Documents\ and\ Settings/')затем относительные пути дляos.system,subprocessметоды, или что угодно...если наилучшие попытки обойти препятствие пробелов в пути продолжают терпеть неудачу, то мое следующее лучшее предложение -избежать имея пробелы в ваших ключевых путей. Не могли бы вы сделать каталог без пробелов, скопировать критический
.exeфайл там, и попробуйте это? Являются ли эти разрушающие хаос пространства абсолютно необходимыми за ваше благополучие...?
при использовании Python 2.7 или выше (особенно до Python 3.5) вы можете использовать следующее:
import subprocess
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)Выполняет команду, описанную args. Ожидает завершения команды, а затем возвращает атрибут returncode.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)Запускает команду с аргументами. Ждет завершения команды. Если код возврата был равен нулю, то возвращает, в противном случае вызывает CalledProcessError. Объект CalledProcessError будет иметь код возврата в коде возврата атрибутпример:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])в обычные строки в Python, С \У комбинации символов сигнализирует расширенная кодовая точка Unicode побег.
вот ссылка на документацию:http://docs.python.org/3.2/library/subprocess.html
для Python 3.5+ теперь вы можете использовать run() во многих случаях:https://docs.python.org/3.5/library/subprocess.html#subprocess.run
ваше использование является правильным. Держу пари, что ваша внешняя программа, flow.exe, должен быть выполнен в своем каталоге, потому что он обращается к некоторым внешним файлам, хранящимся там.
Так что вы можете попробовать:
import sys, string, os, arcgisscripting os.chdir('c:\documents and settings\flow_model') os.system('"C:\Documents and Settings\flow_model\flow.exe"')(остерегайтесь двойных кавычек внутри одинарных кавычек...)
Я бы попытался вставить 'r' перед вашим путем, если бы я был на вашем месте, чтобы указать, что это необработанная строка - и тогда вам не придется использовать прямые косые черты. Например:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
самый простой способ-это:
import os os.startfile("C:\Documents and Settings\flow_model\flow.exe")это работает, я пробовал.
использовать подпроцесс, это меньший модуль, поэтому он запускает
.exeбыстрее.import subprocess subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
С помощью ОС.система:
import os os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
- Это то, что пытается выполнить
C:\Documentsс доводами"and", "Settings/flow_model/flow.exe"?кроме того, вы можете рассмотреть
subprocess.call().
Если бы это был я, Я бы поместил EXE-файл в корневой каталог (C:) и посмотрел, работает ли он так. Если да, то это, вероятно, (уже упомянутые) пробелы в имени каталога. Если нет, то это могут быть некоторые переменные среды.
кроме того, попробуйте проверить вас stderr (используя более ранний ответ int3):
import subprocess process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \ stderr = subprocess.PIPE) if process.stderr: print process.stderr.readlines()код может быть не совсем правильным, поскольку я обычно не использую Popen или Windows, но должен дать идею. Вполне возможно, что сообщение об ошибке на ошибке поток.
Это правильное использование, но, возможно, пробелы в имени пути по какой-то причине все портят.
вы можете запустить программу под cmd.exe, так что вы можете увидеть любой выход из потока.exe, который может указывать на ошибку.
для вышеуказанного вопроса это решение работает.
просто измените путь, где находится исполняемый файл.
import sys, string, os os.chdir('C:\Downloads\xpdf-tools-win-4.00\xpdf-tools-win-4.00\bin64') os.system(r"C:\Downloads\xpdf-tools-win-4.00\xpdf-tools-win-4.00\bin64\flowwork.exe) '''import sys, string, os os.chdir('C:\Downloads\xpdf-tools-win-4.00\xpdf-tools-win-4.00\bin64') os.system(r"C:\Downloads\xpdf-tools-win-4.00\xpdf-tools-win-4.00\bin64\pdftopng.exe test1.pdf rootimage")'''здесь тест1.pdf rootimage-это мой код .
Comments