Запуск зовнішньої програми (виконуваної програми) в Python?


92

Я тільки почав працювати над 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")

Як я можу це виправити?


Відповіді:


45

Ці пробіли насправді можуть турбувати :-(. Спробуйте os.chdir('C:/Documents\ and\ Settings/')слідувати за відносними шляхами для os.system, subprocessметодів або чого завгодно ...

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


1
Олексій, дякую. Це теж спрацювало. У мене ще одне запитання, якщо ви не проти. Як щодо того, якщо мій виконуваний файл запитує ім’я мого вхідного файлу? Я намагався зробити це за допомогою stdin, але поки не зміг досягти успіху?
Месут

2
@mesut, що це за виконуваний файл, який "просить" ім’я файлу? Наприклад, якщо це його власне стандартне введення, ви можете використати subprocess.Popenдля передачі туди бажаних значень. Якщо воно заглиблюється (за допомогою вводу "консолі"), спробуйте wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .
Алекс Мартеллі,

вхідний файл - це базовий файл .txt у тій же папці. Зараз код відкриває exe із вікна cmd. І виконуваний файл запитує ім'я вхідного файлу. Чи є спосіб, яким я можу просто визначити це ім’я (можливо, як шлях) у коді? Я спробував subprocess.popen і спробував заглянути в змінні. Я думав, що можу використовувати stdin, але насправді не вийшло. Я був би дуже вдячний, якщо ви можете дати мені зразок з subprocess.popen із виконуваним файлом, що знаходиться в C: \ flow_model, ім'ям виконуваного файлу як flow.exe та ім'ям вхідного файлу, що знаходиться в тій же папці, що і sac_bsl.txt
Месут

Частина "запитувати ім'я вхідного файлу" є проблемою. Не знати нічого про те, як кодується цей exe, як я вже згадував, wexpectє найбільш вірогідним рішенням, оскільки воно дозволяє вам змоделювати саме те, що цей файл exe побачить при виклику у вікні cmd.
Алекс Мартеллі,

42

Якщо ви використовуєте 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 матиме код повернення в атрибуті 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 рекомендує запустити ()
Рікардо Зоріо

33

Найпростіший спосіб:

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

Це працює; Я спробував.


працює належним чином, але чи є спосіб додати такі параметри, як -start тощо?
Бассем Шахін

1
Чи не працює: module 'os' has no attribute 'startfile'. (Використовуючи python3.6)
not2qubit

Мабуть, не працює ні з чим, пов'язаним з Windows, на відміну від враження, яке створює документація .
not2qubit

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

(Остерігайтеся подвійних лапок всередині одинарних лапок ...)


Чудово працює, як можна зберігати результати безпосередньо у фреймі даних?
Сад,

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, як і у випадку з файлом Windows * .bat.
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?

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