Я только начал работать над 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")
Как я могу это исправить?
python
executable
Месут
источник
источник
Ответы:
Эти пробелы могут действительно беспокоить :-(. Попробуйте
os.chdir('C:/Documents\ and\ Settings/')
следовать относительным путям дляos.system
,subprocess
методов или чего-то еще ...Если максимальные усилия обойти препятствие, связанное с пробелами в пути, продолжают терпеть неудачу, то мое следующее лучшее предложение - избегать пробелов на ваших важнейших путях. Не могли бы вы создать каталог без пробелов, скопировать
.exe
туда важный файл и попробовать это ? Это разрушительное пространство абсолютно необходимо для вашего благополучия ...?источник
subprocess.Popen
для передачи туда желаемых значений. Если он идет глубже (с использованием «консольного» ввода), попробуйте wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
этот exe-файл , как я уже упоминал, является наиболее вероятным решением, поскольку оно позволяет вам точно имитировать то, что этот exe-файл будет видеть при вызове в окне cmd.Если вы используете Python 2.7 или выше (особенно до Python 3.5), вы можете использовать следующее:
import subprocess
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Выполняет команду, описанную аргументом args. Ожидает завершения команды, затем возвращает атрибут кода возврата.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Запускает команду с аргументами. Ожидает завершения команды. Если код возврата был нулевым, возвращается, в противном случае вызывает CalledProcessError. Объект CalledProcessError будет иметь код возврата в атрибуте returncodeПример:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
Вот ссылка на документацию: http://docs.python.org/3.2/library/subprocess.html
Для Python 3.5+ теперь вы можете использовать run () во многих случаях: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
источник
Самый простой способ:
import os os.startfile("C:\Documents and Settings\flow_model\flow.exe")
Оно работает; Я пробовал.
источник
module 'os' has no attribute 'startfile'
. (Используя python3.6)На вашем месте я бы попытался вставить букву r перед вашим путем, чтобы указать, что это необработанная строка - и тогда вам не придется использовать косую черту. Например:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
источник
Ваше использование правильное. Готов поспорить, что ваша внешняя программа 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"')
(Остерегайтесь двойных кавычек внутри одинарных ...)
источник
Используйте подпроцесс , это меньший модуль, поэтому он работает
.exe
быстрее.import subprocess subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
источник
.exe
быстрее?Используя os.system :
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"])
источник
Если бы это был я, я бы поместил 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, но должен дать представление. Вполне возможно, что сообщение об ошибке находится в потоке ошибок.
источник
import os path = "C:/Documents and Settings/flow_model/" os.chdir(path) os.system("flow.exe")
источник
в python 2.6 используйте строку, заключенную в кавычки "и апостроф". Также замените single / на double //. Ваш рабочий пример будет выглядеть так:
import os os.system("'C://Documents and Settings//flow_model//flow.exe'")
Также Вы можете использовать любые параметры, если Ваша программа их принимает.
os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')
наконец, вы можете использовать строковую переменную, например, построение графика с использованием gnuplot непосредственно из python:
this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot' this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"' os.system(this_program+" "+this_par)
источник
Это пытается выполнить
C:\Documents
с аргументами"and", "Settings/flow_model/flow.exe"
?Кроме того, вы можете подумать
subprocess.call()
.источник
Это правильное использование, но, возможно, пробелы в имени пути по какой-то причине портят ситуацию.
Вы также можете запустить программу под cmd.exe, чтобы вы могли видеть любые выходные данные flow.exe, которые могут указывать на ошибку.
источник
Существует множество различных решений, и результаты будут сильно зависеть от:
Поскольку я обнаружил, что некоторые вещи, которые, как утверждается, работают только в Windows, нет, вероятно, потому, что я использую Cygwin, который перехитрил способ ОС для работы с путями Windows. Остальное работает только в ОС на основе чистого * nix или в Python2 или 3.
Вот мои выводы:
os.system()
это самый щадящий метод.os.startfile()
наименее прощающий. (Только для Windows &&, если повезет)subprocess.Popen([...])
не рекомендуетсяsubprocess.run(winView, shell=True)
рекомендуемый способ!subprocess
для чего-либо может представлять угрозу безопасности .Попробуйте эти:
import os, subprocess ... winView = '/cygdrive/c/Windows/explorer.exe %s' % somefile ... # chose one of these: os.system(winView) subprocess.Popen(['/cygdrive/c/Windows/explorer.exe', 'somefile.png']) subprocess.run(winView, shell=True)
В: Почему вы хотите использовать
explorer
в Windows?A: Потому что, если вы просто хотите посмотреть результаты какого-то нового файла, проводник автоматически откроет файл с любой программой Windows по умолчанию, которую вы установили для этого типа файла. Поэтому нет необходимости повторно указывать программу по умолчанию для использования.
источник
для вышеуказанного вопроса это решение работает.
просто измените путь к месту, где находится ваш исполняемый файл.
import sys, string, os os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64') os.system("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")'''
Здесь test1.pdf rootimage предназначен для моего кода.
источник
"
вos.system
?