Подтвердить что ты не робот

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

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

У меня есть исполняемый файл для программы, написанной в Fortran. Допустим, имя исполняемого файла - 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")

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если вы используете 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 будет код возврата в атрибуте 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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')

Ответ 8

Try

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

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

Здесь test1.pdf rootimage для моего кода.

Ответ 13

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

Ответ 14

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

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

Ответ 15

The Only best solution is:

import win32api
win32api.WinExec('notepad.exe')

Ответ 16

в Python 2.6 используйте строку, заключенную в кавычки "и апострофы". Также измените одиночный/на двойной //. Ваш рабочий пример будет выглядеть так:

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)