Запуск внешней программы (исполняемый файл) в 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")


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

1122   12  

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"')

попробовать

import subprocess
subprocess.call(["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

    Ничего не найдено.