Python'da bir dış program (yürütülebilir) mı çalıştırıyorsunuz?


92

Python üzerinde çalışmaya başladım ve Python'dan dışarıdan bir yürütülebilir dosya çalıştırmaya çalışıyorum.

Fortran'da yazılmış bir program için çalıştırılabilir bir dosyam var. Çalıştırılabilir dosyanın adının flow.exe olduğunu varsayalım. Ve çalıştırılabilir dosyam şurada bulunuyor C:\Documents and Settings\flow_model. Hem os.system hem de popen komutlarını denedim, ancak şu ana kadar çalışmasını sağlayamadım. Aşağıdaki kod komut penceresini açıyor gibi görünüyor, ancak modeli çalıştırmıyor.

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

Bunu nasıl düzeltebilirim?


Yanıtlar:


44

Bu boşluklar gerçekten can sıkıcı olabilir :-(. Aşağıdakiler os.chdir('C:/Documents\ and\ Settings/')için göreli yolları os.system, subprocessyöntemleri veya her neyse onu izlemeyi deneyin ...

En iyi çaba, yoldaki beyaz boşlukları atlatmaya çalışırsa başarısız olmaya devam ederse, bir sonraki en iyi önerim, önemli yollarınızda boşluklardan kaçınmaktır . Eğer bir boşlukları daha az dizin yapmak çok önemli kopyalanamadı .exeorada dosyası ve denemek o ? Bu yıkıcı alan, refahınız için kesinlikle gerekli mi?


1
Alex, teşekkürler. Bu da çalıştı. Sakıncası yoksa bir sorum daha var. Çalıştırılabilir dosyam girdi dosyamın adını soruyorsa nasıl olur? Bunu stdin kullanarak yapmaya çalıştım ama şimdiye kadar başarılı olamadım?
Mesut

2
@mesut, dosya adını "sormak" için kullanılan yürütülebilir dosya nedir? Örneğin, kendi standart subprocess.Popengirişiyse, istediğiniz değerleri oraya yönlendirmek için kullanabilirsiniz . Daha derine inerse ("konsol" girişini kullanarak), wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect'i deneyin .
Alex Martelli

giriş dosyası aynı klasörde bulunan temel bir .txt dosyasıdır. Kod şu anda cmd penceresinden exe'yi açar. Ve yürütülebilir dosya, girdi dosyasının adını sorar. Bu adı (belki bir yol olarak) kod içinde tanımlamanın bir yolu var mı? Subprocess.popen denedim ve değişkenlere bakmaya çalıştım. Stdin'i kullanabileceğimi düşündüm ama gerçekten işe yaramadı. Bana C: \ flow_model'de bulunan yürütülebilir dosya, flow.exe olarak çalıştırılabilir dosyanın adı ve sac_bsl.txt ile aynı klasörde bulunan girdi dosyasının adı ile birlikte subprocess.popen ile bir örnek verebilirseniz çok memnun olurum
Mesut

"Girdi dosyasının adını sor" kısmı zahmetli olanıdır. Bu exe'nin nasıl kodlandığı hakkında hiçbir şey bilmemek, daha önce de bahsettiğim gibi wexpect, en olası çözümdür, çünkü bir cmd penceresinde çağrıldığında o exe dosyasının tam olarak ne göreceğini simüle etmenize izin verir.
Alex Martelli

42

Python 2.7 veya üstünü kullanıyorsanız (özellikle Python 3.5'ten önce) aşağıdakileri kullanabilirsiniz:

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Args tarafından tanımlanan komutu çalıştırır. Komutun tamamlanmasını bekler ve ardından returncode niteliğini döndürür.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Komutu bağımsız değişkenlerle çalıştırır. Komutun tamamlanmasını bekler. Dönüş kodu sıfırsa geri döner, aksi takdirde CalledProcessError'ı yükseltir. CalledProcessError nesnesi, returncode özniteliğinde dönüş koduna sahip olacaktır.

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

Normal Python dizelerinde, \ U karakter kombinasyonu genişletilmiş bir Unicode kod noktası kaçışını işaret eder.

Belgelerin bağlantısı: http://docs.python.org/3.2/library/subprocess.html

Python 3.5+ için artık birçok durumda run () kullanabilirsiniz: https://docs.python.org/3.5/library/subprocess.html#subprocess.run



34

En basit yol şudur:

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

İşe yarıyor; Denedim.


1
düzgün çalışıyor, ancak -start gibi parametreler eklemenin bir yolu var mı?
Bassem Shahin

1
Çalışmaz: module 'os' has no attribute 'startfile'. (
Python3.6

Görünüşe göre, belgelerin verdiği izlenimin aksine, Windows ile ilgili hiçbir şey üzerinde çalışmıyor .
not2qubit

Yalnızca ipython ile çalışıyor gibi görünüyor
user3273814

24

Yerinde olsam, bunun ham bir dize olduğunu belirtmek için yolunuzun önüne bir 'r' eklemeyi denerdim - ve sonra eğik çizgi kullanmak zorunda kalmazsınız. Örneğin:

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

19

Kullanımınız doğru. Bahse girerim, harici programınız olan flow.exe'nin kendi dizininde çalıştırılması gerekiyor, çünkü orada depolanan bazı harici dosyalara erişiyor.

Yani deneyebilirsiniz:

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

(Tek tırnak içindeki çift tırnaklara dikkat edin ...)


Mükemmel çalışıyor, sonuçlar doğrudan bir veri çerçevesine nasıl saklanır?
Sade

11

Alt işlem kullanın , daha küçük bir modül olduğundan .exedaha hızlı çalışır .

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

1
Bunu demek başlar.exe çabuk?
Peter Mortensen

8

Os.system kullanarak :

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

4

Deneyin

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

denedi ve aynı şey oldu. cmd penceresini açıyor gibi görünüyor, ancak daha sonra yürütülebilir dosyayı çalıştırmayacak. Yürütülebilir dosyayı ayrı olarak denedim ve iyi çalışıyor. Klasörü C: / flow_model olarak da taşıdım. Bir fark yaratmadı. ??
Mesut

2

Ben olsaydım, EXE dosyasını kök dizine (C :) koyar ve böyle çalışıp çalışmadığına bakardım. Eğer öyleyse, muhtemelen dizin adındaki (daha önce bahsedilen) boşluklardır. Değilse, bazı ortam değişkenleri olabilir.

Ayrıca, stderr olup olmadığınızı kontrol etmeyi deneyin (int3 tarafından daha önceki bir cevabı kullanarak):

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

Genelde Popen veya Windows kullanmadığım için kod tamamen doğru olmayabilir, ancak fikir vermeliyim. Hata mesajı hata akışında olabilir.


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

1
Lütfen kodunuzun bu soruyu neden çözdüğüne dair bir açıklama ekleyin.
rje

Bu gönderi, temelde yürütülen * .exe dosyasını, Windows * .bat dosyasını kullanır gibi ele almaktadır.
SamAct

2

python 2.6'da tırnak "ve kesme işareti" işaretleri içine alınmış dizeyi kullanın. Ayrıca tek / çift olarak bir değişiklik //. Çalışma örneğiniz şöyle görünecektir:

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

Ayrıca, programınız bunları besliyorsa herhangi bir parametreyi de kullanabilirsiniz.

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

nihayet gnuplot kullanarak doğrudan python'dan çizim yaparken, string değişkenini kullanabilirsiniz:

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

Bu, C:\Documentsargümanlarıyla "and", "Settings/flow_model/flow.exe"mı yürütülmeye çalışıyor ?

Ayrıca düşünebilirsiniz subprocess.call().


0

Doğru kullanım budur, ancak yol adındaki boşluklar bazı nedenlerden dolayı işleri karıştırıyor olabilir.

Programı cmd.exe altında da çalıştırmak isteyebilirsiniz, böylece flow.exe'den bir hata olduğunu gösteren herhangi bir çıktıyı görebilirsiniz.


0

Bir sürü farklı çözüm var ve sonuçlar büyük ölçüde şunlara bağlı olacaktır:

  • kullandığınız işletim sistemi: Windows, Cygwin, Linux, MacOS
  • kullandığınız python sürümü: Python2 veya Python3x

Sadece Windows'ta çalıştığı iddia edilen bazı şeyleri keşfettiğim gibi, muhtemelen Windows yollarıyla başa çıkmak için işletim sisteminin yolunu aşan Cygwin'i kullandığım için değil. Diğer şeyler yalnızca saf * nix tabanlı işletim sistemlerinde veya Python2 veya 3'te çalışır.

İşte bulgularım:

  • Genel olarak konuşmak gerekirse, os.system()en bağışlayıcı yöntemdir.
  • os.startfile()en az bağışlayıcıdır. (Yalnızca Windows && şanslıysanız)
  • subprocess.Popen([...]) değil tavsiye
  • subprocess.run(winView, shell=True) önerilen yol!
  • subprocessHerhangi bir şey için kullanmanın bir güvenlik riski oluşturabileceğini hatırlamak .

Bunları dene:

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)

S: Neden explorerWindows'ta kullanmak istersiniz ?

C: Çünkü sadece yeni bir dosyanın sonuçlarına bakmak istiyorsanız, explorer dosyayı otomatik olarak o dosya türü için ayarladığınız varsayılan Windows programıyla açacaktır. Bu nedenle, kullanılacak varsayılan programı yeniden belirlemenize gerek yoktur.


0

Yukarıdaki soru için bu çözüm işe yarıyor.

sadece çalıştırılabilir dosyanızın bulunduğu yere giden yolu değiştirin.

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

Burada test1.pdf rootimage benim kodum içindir.


Eğer bir kapanış unuttunuz mu "içinde os.system?
Suraj Rao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.