Chạy một chương trình bên ngoài (thực thi) bằng Python?


92

Tôi mới bắt đầu làm việc trên Python và tôi đã cố gắng chạy một tệp thực thi bên ngoài từ Python.

Tôi có một tệp thực thi cho một chương trình được viết bằng Fortran. Giả sử tên của tệp thực thi là flow.exe. Và tệp thực thi của tôi được đặt tại C:\Documents and Settings\flow_model. Tôi đã thử cả hai lệnh os.system và popen, nhưng cho đến nay tôi không thể làm cho nó hoạt động. Đoạn mã sau có vẻ như nó sẽ mở ra cửa sổ lệnh, nhưng nó sẽ không thực thi mô hình.

# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")

Làm thế nào tôi có thể sửa lỗi này?


2
Có thể có bản sao của Gọi lệnh bên ngoài bằng Python
mkobit

Câu trả lời:


45

Những khoảng trắng đó thực sự có thể gây phiền hà :-(. Hãy thử làm os.chdir('C:/Documents\ and\ Settings/')theo các đường dẫn tương đối cho os.system, subprocessphương thức hoặc bất cứ thứ gì ...

Nếu nỗ lực hết sức cố gắng vượt qua rào cản khoảng trắng trong đường đi tiếp tục thất bại, thì gợi ý tốt nhất tiếp theo của tôi là tránh để có khoảng trống trên những con đường quan trọng của bạn. Bạn không thể tạo một thư mục không có khoảng trống, sao chép .exetệp quan trọng vào đó và thử xem ? Những không gian tàn phá đó có thực sự cần thiết cho hạnh phúc của bạn không ...?


1
Alex, cảm ơn. Điều này cũng hoạt động. Tôi có một câu hỏi nữa nếu bạn không phiền. Còn nếu tệp thực thi của tôi yêu cầu tên tệp đầu vào của tôi thì sao? Tôi đã cố gắng làm điều đó bằng cách sử dụng stdin nhưng không thể thành công cho đến nay?
Mesut

2
@mesut, tệp thực thi đó sử dụng gì để "yêu cầu" tên tệp? Ví dụ: nếu đó là đầu vào chuẩn của riêng nó, bạn có thể sử dụng subprocess.Popenđể chuyển các giá trị mong muốn của mình vào đó. Nếu nó đi sâu hơn (sử dụng đầu vào "bảng điều khiển"), hãy thử wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .
Alex Martelli

tệp đầu vào là tệp .txt cơ bản trong cùng một thư mục. Mã ngay bây giờ sẽ mở exe từ cửa sổ cmd. Và tệp thực thi yêu cầu tên của tệp đầu vào. Có cách nào để tôi có thể xác định tên này (có thể là một đường dẫn) trong mã không? Tôi đã thử subprocess.popen và tôi đã cố gắng tìm kiếm các biến. Tôi nghĩ rằng tôi có thể sử dụng stdin nhưng không thực sự hiệu quả. Tôi thực sự đánh giá cao nếu bạn có thể cho tôi một mẫu với subprocess.popen với tệp thực thi nằm trong C: \ flow_model, tên của tệp thực thi là flow.exe và tên của tệp đầu vào nằm trong cùng thư mục với sac_bsl.txt
Mesut

Phần "hỏi tên của tệp đầu vào" là một vấn đề rắc rối. Không biết bất cứ điều gì về cách mã exe đó, như tôi đã đề cập, wexpectlà giải pháp khả thi nhất, vì nó cho phép bạn mô phỏng chính xác những gì tệp exe đó sẽ thấy khi được gọi trong cửa sổ cmd.
Alex Martelli

42

Nếu sử dụng Python 2.7 trở lên (đặc biệt là trước Python 3.5), bạn có thể sử dụng như sau:

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Chạy lệnh được mô tả bởi args. Chờ lệnh hoàn tất, sau đó trả về thuộc tính mã trả lại.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Chạy lệnh với các đối số. Chờ lệnh hoàn tất. Nếu mã trả về bằng 0 thì trả về, ngược lại làm tăng CalledProcessError. Đối tượng CalledProcessError sẽ có mã trả lại trong thuộc tính mã trả lại

Thí dụ: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

Trong các chuỗi Python thông thường, tổ hợp ký tự \ U báo hiệu một lối thoát điểm mã Unicode mở rộng.

Đây là liên kết đến tài liệu: http://docs.python.org/3.2/library/subprocess.html

Đối với Python 3.5+, bạn có thể sử dụng run () trong nhiều trường hợp: https://docs.python.org/3.5/library/subprocess.html#subprocess.run


7
Python 3.6.3 khuyến nghị run ()
Ricardo Zorio

33

Cách đơn giản nhất là:

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

Nó hoạt động; Tôi đã thử nó.


hoạt động bình thường, nhưng có cách nào để thêm các tham số như -start, v.v. không?
Bassem Shahin

1
Không hoạt động: module 'os' has no attribute 'startfile'. (Sử dụng python3.6)
not2qubit

Rõ ràng là không hoạt động trên bất kỳ thứ gì liên quan đến Windows, trái ngược với ấn tượng mà tài liệu mang lại.
not2qubit

24

Tôi sẽ thử chèn một chữ 'r' vào trước đường dẫn của bạn nếu tôi là bạn, để cho biết rằng đó là một chuỗi thô - và sau đó bạn sẽ không phải sử dụng dấu gạch chéo. Ví dụ:

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

19

Cách sử dụng của bạn là đúng. Tôi cá rằng chương trình bên ngoài của bạn, flow.exe, cần phải được thực thi trong thư mục của nó, vì nó truy cập một số tệp bên ngoài được lưu trữ ở đó.

Vì vậy, bạn có thể thử:

import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')

(Hãy coi chừng dấu ngoặc kép bên trong dấu ngoặc kép ...)


Hoạt động hoàn hảo, làm cách nào để lưu trữ kết quả trực tiếp vào khung dữ liệu?
Sade

11

Sử dụng quy trình con , nó là một mô-đun nhỏ hơn nên chạy .exenhanh hơn.

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

1
Bạn có nghĩa là nó bắt đầu sự .exenhanh hơn?
Peter Mortensen


4

Thử

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

đã thử nó và điều tương tự đã xảy ra. Có vẻ như nó sẽ mở cửa sổ cmd nhưng sau đó nó sẽ không chạy tệp thực thi. Tôi đã thử tệp thực thi riêng biệt và nó hoạt động tốt. Tôi cũng đã di chuyển thư mục dưới dạng C: / flow_model. Không tạo ra sự khác biệt. ??
Mesut

2

Nếu là tôi, tôi sẽ đặt tệp EXE vào thư mục gốc (C :) và xem nó có hoạt động như vậy không. Nếu vậy, có thể đó là các khoảng trắng (đã được đề cập) trong tên thư mục. Nếu không, nó có thể là một số biến môi trường.

Ngoài ra, hãy thử kiểm tra bạn stderr (sử dụng câu trả lời trước đó của int3):

import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \
                           stderr = subprocess.PIPE)
if process.stderr:
    print process.stderr.readlines()

Mã có thể không hoàn toàn chính xác vì tôi thường không sử dụng Popen hoặc Windows, nhưng nên đưa ra ý tưởng. Có thể thông báo lỗi nằm trên dòng lỗi.


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

1
Vui lòng thêm giải thích tại sao mã của bạn giải quyết được câu hỏi này.
rje

Bài đăng này về cơ bản xử lý tệp * .exe đang được thực thi như cách bạn sử dụng tệp windows * .bat.
SamAct

2

trong python 2.6 sử dụng chuỗi được đặt bên trong dấu ngoặc kép "và dấu nháy đơn". Ngoài ra, một thay đổi đơn / thành kép //. Ví dụ làm việc của bạn sẽ giống như sau:

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

Ngoài ra, Bạn có thể sử dụng bất kỳ tham số nào nếu chương trình của Bạn ăn chúng.

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

cuối cùng Bạn có thể sử dụng biến chuỗi, như một ví dụ là lập biểu đồ bằng cách sử dụng gnuplot trực tiếp từ 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

Điều đó đang cố gắng thực hiện C:\Documentsvới các đối số của "and", "Settings/flow_model/flow.exe"?

Ngoài ra, bạn có thể cân nhắc subprocess.call().


0

Đó là cách sử dụng chính xác, nhưng có lẽ các khoảng trắng trong tên đường dẫn đang làm mọi thứ rối tung lên vì một số lý do.

Bạn cũng có thể muốn chạy chương trình dưới cmd.exe để có thể thấy bất kỳ đầu ra nào từ flow.exe có thể chỉ ra lỗi.


0

Có vô số giải pháp khác nhau và kết quả sẽ phụ thuộc nhiều vào:

  • hệ điều hành bạn đang sử dụng: Windows, Cygwin, Linux, MacOS
  • phiên bản python bạn đang sử dụng: Python2 hoặc Python3x

Như tôi đã phát hiện ra một số thứ được cho là chỉ hoạt động trong Windows, thì không, có thể là do tôi tình cờ sử dụng Cygwin, công cụ này đang vượt xa cách hệ điều hành để xử lý các đường dẫn Windows. Những thứ khác chỉ hoạt động trong hệ điều hành dựa trên * nix thuần túy hoặc trong Python2 hoặc 3.

Đây là những phát hiện của tôi:

  • Nói chung, os.system()là phương pháp dễ tha thứ nhất.
  • os.startfile()là ít tha thứ nhất. (Chỉ dành cho Windows && nếu bạn may mắn)
  • subprocess.Popen([...]) không được khuyến khích
  • subprocess.run(winView, shell=True) cách được đề nghị!
  • Hãy nhớ rằng sử dụng subprocesscho bất cứ thứ gì có thể gây ra rủi ro bảo mật .

Thử những thứ này xem:

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)

Q: Tại sao bạn muốn sử dụng explorer trong Windows?

A: Bởi vì nếu bạn chỉ muốn xem kết quả của một số tệp mới, explorer sẽ tự động mở tệp bằng bất kỳ chương trình windows mặc định nào bạn đã đặt cho loại tệp đó. Vì vậy, không cần chỉ định lại chương trình mặc định để sử dụng.


0

cho câu hỏi trên, giải pháp này hoạt động.

chỉ cần thay đổi đường dẫn đến nơi chứa tệp thực thi của bạn.

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

Đây là mã của tôi test1.pdf rootimage.


Bạn đã quên đóng cửa "tại os.system?
Suraj Rao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.