Запуск внешней программы (исполняемого файла) на Python?


92

Я только начал работать над 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")

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


2
Возможный дубликат вызова внешней команды в Python
mkobit 06

Ответы:


44

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

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


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

2
@mesut, что этот исполняемый файл использует, чтобы «спросить» имя файла? Например, если это его собственный стандартный ввод, вы можете использовать его subprocess.Popenдля передачи туда желаемых значений. Если он идет глубже (с использованием «консольного» ввода), попробуйте wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .
Alex Martelli

входной файл - это базовый файл .txt в той же папке. Код прямо сейчас открывает exe из окна cmd. И исполняемый файл запрашивает имя входного файла. Есть ли способ, которым я могу просто определить это имя (возможно, как путь) в коде? Я попробовал subprocess.popen и попытался посмотреть в переменных. Я думал, что могу использовать стандартный ввод, но у меня ничего не вышло. Я был бы очень признателен, если бы вы предоставили мне образец с subprocess.popen с исполняемым файлом, расположенным в C: \ flow_model, именем исполняемого файла как flow.exe и именем входного файла, расположенного в той же папке, что и sac_bsl.txt
Mesut

Часть "спросить имя входного файла" является проблемной. Ничего не зная о том, как кодируется wexpectэтот exe-файл , как я уже упоминал, является наиболее вероятным решением, поскольку оно позволяет вам точно имитировать то, что этот exe-файл будет видеть при вызове в окне cmd.
Alex Martelli

42

Если вы используете 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"])

В обычных строках 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


7
Python 3.6.3 рекомендует run ()
Рикардо Зорио,

34

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

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

Оно работает; Я пробовал.


1
работает правильно, но есть ли способ добавить такие параметры, как -start и так далее?
Bassem Shahin

1
Не работает: module 'os' has no attribute 'startfile'. (Используя python3.6)
not2qubit 03

По-видимому, не работает ни с чем связанным с Windows, вопреки впечатлению, которое дает документация .
not2qubit 03

Кажется, работает только с ipython
user3273814

24

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

os.system(r"C:\Documents and Settings\flow_model\flow.exe")

19

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

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


Отлично работает, как сохранить результаты непосредственно в фреймворке данных?
Sade

11

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

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])

1
Вы имеете в виду , что начинается.exe быстрее?
Питер Мортенсен


4

Пытаться

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])

попробовал и случилось то же самое. кажется, что он открывает окно cmd, но тогда он не запускает исполняемый файл. Я пробовал исполняемый файл отдельно, и он отлично работает. Я также переместил папку как C: / flow_model. Ничего не изменилось. ??
Месут

2

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


2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")

1
Пожалуйста, объясните, почему ваш код решает этот вопрос.
rje

Этот пост в основном рассматривает исполняемый файл * .exe, как если бы вы использовали файл * .bat для Windows.
SamAct

2

в 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)

1

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

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


0

Это правильное использование, но, возможно, пробелы в имени пути по какой-то причине портят ситуацию.

Вы также можете запустить программу под cmd.exe, чтобы вы могли видеть любые выходные данные flow.exe, которые могут указывать на ошибку.


0

Существует множество различных решений, и результаты будут сильно зависеть от:

  • ОС, которую вы используете: Windows, Cygwin, Linux, MacOS
  • версия python, которую вы используете: Python2 или Python3x

Поскольку я обнаружил, что некоторые вещи, которые, как утверждается, работают только в 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 по умолчанию, которую вы установили для этого типа файла. Поэтому нет необходимости повторно указывать программу по умолчанию для использования.


0

для вышеуказанного вопроса это решение работает.

просто измените путь к месту, где находится ваш исполняемый файл.

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?
Сурадж Рао
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.