Запускать внешнюю программу (исполняемый файл) на Python? - PullRequest
78 голосов
/ 28 ноября 2009

Я только начал работать над Python и пытался запустить внешний исполняемый файл из Python.

У меня есть исполняемый файл для программы, написанной на Фортране. Допустим, имя исполняемого файла - flow.exe. И мой исполняемый файл находится в C:\Documents and Settings\flow_model. Я пробовал обе команды os.system и popen, но до сих пор не мог заставить это работать. Следующий код выглядит так, как будто он открывает командное окно, но он не будет выполнять модель.

# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")

Как я могу это исправить?

Ответы [ 15 ]

40 голосов
/ 09 ноября 2012

Если вы используете Python 2.7 или выше (особенно до Python 3.5), вы можете использовать следующее:

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Запускает команду, описанную аргументами. Ожидает завершения команды, затем возвращает атрибут кода возврата.
  • 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 комбинация символов \ U сигнализирует расширенная кодовая точка 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

38 голосов
/ 28 ноября 2009

Эти пробелы могут действительно беспокоить :-(. Попробуйте os.chdir('C:/Documents\ and\ Settings/'), за которым следуют относительные пути для os.system, subprocess методов или что угодно ...

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

21 голосов
/ 01 мая 2012

Самый простой способ:

import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")

Работает; Я попробовал это.

21 голосов
/ 28 ноября 2009

Я бы попробовал вставить «r» перед вашим путем, чтобы указать, что это необработанная строка - и тогда вам не придется использовать косую черту. Например:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")
20 голосов
/ 28 ноября 2009

Ваше использование правильно. Могу поспорить, что ваша внешняя программа, 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"')

(Остерегайтесь двойных кавычек внутри одинарных кавычек ...)

9 голосов
/ 06 октября 2014

Используйте подпроцесс , это меньший модуль, поэтому он работает на .exe быстрее.

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
7 голосов
/ 17 октября 2014

Используя os.system :

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
3 голосов
/ 28 ноября 2009

Попробуйте

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
1 голос
/ 28 ноября 2009

Если бы это был я, я бы поместил 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, но должен дать идею. Вполне возможно, что сообщение об ошибке находится в потоке ошибок.

1 голос
/ 28 ноября 2009

Это попытка выполнить C:\Documents с аргументами "and", "Settings/flow_model/flow.exe"?

Кроме того, вы можете рассмотреть subprocess.call().

...