पायथन में एक बाहरी कार्यक्रम (निष्पादन योग्य) चल रहा है?


92

मैंने अभी पायथन पर काम करना शुरू किया है, और मैं पायथन से बाहर के निष्पादन योग्य को चलाने की कोशिश कर रहा हूं।

मेरे पास फोरट्रान में लिखे गए एक कार्यक्रम के लिए एक निष्पादन योग्य है। मान लें कि निष्पादन योग्य नाम का नाम 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.systemsubprocess

अगर व्हाट्सएप-इन-पथ बाधा को बायपास करने के लिए सबसे अच्छा प्रयास विफल रहता है, तो मेरा अगला सबसे अच्छा सुझाव है कि आपके महत्वपूर्ण रास्तों में रिक्त स्थान से बचने के लिए । यदि आप एक रिक्त स्थान को कम कर सकता है निर्देशिका नहीं, महत्वपूर्ण कॉपी .exeवहाँ फ़ाइल, और कोशिश है कि ? क्या वे कहर-कहर बरपाने ​​वाले स्थान आपके कल्याण के लिए अत्यंत आवश्यक हैं ...?


1
एलेक्स, धन्यवाद। इस पर भी काम हुआ। मैं एक और सवाल है अगर तुम बुरा मत मानना। यदि मेरा निष्पादन योग्य मेरे इनपुट फ़ाइल के नाम के लिए पूछ रहा है तो कैसे होगा? मैंने इसे स्टडिन का उपयोग करने की कोशिश की, लेकिन अभी तक सफल नहीं हो सका?
मेसुत

2
@mesut, फ़ाइल नाम को "पूछने" के लिए प्रयोग करने योग्य क्या है? यदि यह अपना स्वयं का मानक-इनपुट है, उदाहरण के लिए, आप subprocess.Popenअपने इच्छित मूल्यों को पाइप करने के लिए उपयोग करने में सक्षम हो सकते हैं । यदि यह गहरा हो जाता है ("कंसोल" इनपुट का उपयोग करके), wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect आज़माएं
एलेक्स मार्टेली

इनपुट फ़ाइल एक ही फ़ोल्डर में एक मूल .txt फ़ाइल है। कोड अभी cmd विंडो से exe को खोलता है। और निष्पादन योग्य इनपुट फ़ाइल का नाम पूछता है। क्या कोई ऐसा तरीका है जिससे मैं कोड के भीतर इस नाम (शायद पथ के रूप में) को परिभाषित कर सकता हूं? मैंने subprocess.popen की कोशिश की और मैंने चर में देखने की कोशिश की। मैंने सोचा कि मैं स्टडिन का उपयोग कर सकता हूं, लेकिन वास्तव में काम नहीं करता। मैं वास्तव में सराहना करूंगा यदि आप मुझे C: \ flow_model में स्थित निष्पादन योग्य के साथ subprocess.popen के साथ एक नमूना दे सकते हैं, flow.exe के रूप में निष्पादन योग्य का नाम और इनपुट फ़ाइल का नाम sac.bsl.txt
मेसुत

"इनपुट फ़ाइल के नाम के लिए पूछें" भाग एक परेशानी है। उस exe को कैसे कोडित किया जाता है, इस बारे में कुछ भी नहीं पता है, जैसा कि मैंने पहले ही उल्लेख किया है, wexpectयह सबसे अच्छा समाधान है, क्योंकि यह आपको अनुकरण करता है कि वास्तव में उस exe फ़ाइल को एक cmd विंडो में कब देखा जाएगा।
एलेक्स मार्टेली

42

यदि पायथन 2.7 या उच्चतर (विशेषकर पाइथन 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 वस्तु का रिटर्न कोड रिटर्नकोड विशेषता में होगा

उदाहरण: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

नियमित पायथन स्ट्रिंग्स में, \ U वर्ण संयोजन एक विस्तारित यूनिकोड कोड बिंदु से बच निकलता है।

यहाँ प्रलेखन का लिंक है: http://docs.python.org/3.2/library/subprocess.html

पायथन 3.5+ के लिए अब आप कई मामलों में रन () का उपयोग कर सकते हैं: https://docs.python.org/3.5/library/subprocess.html#subprocess.run



33

सबसे सरल तरीका है:

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

यह काम करता हैं; मैं इसे करने की कोशिश की।


ठीक से काम कर रहा है, लेकिन वहाँ एक रास्ता जोड़ने की तरह है -स्टार्ट और इतने पर?
बिसम शाहीन

1
काम नहीं करता है module 'os' has no attribute 'startfile':। (Python3.6 का उपयोग करते हुए)
not2qubit

जाहिरा तौर पर विंडोज से संबंधित किसी भी चीज पर काम नहीं करता है, जो कि दस्तावेज देता है छाप के विपरीत है।
not2qubit

24

मैं आपके रास्ते के सामने एक 'आर' डालने की कोशिश करूंगा अगर मैं आप थे, तो यह संकेत देने के लिए कि यह एक कच्चा तार है - और फिर आपको आगे की स्लैश का उपयोग नहीं करना पड़ेगा। उदाहरण के लिए:

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

(सिंगल कोट्स के अंदर दोहरे उद्धरणों से सावधान रहें ...)


पूरी तरह से काम करता है, कैसे एक डेटाफ़्रेम को सीधे परिणाम स्टोर करेगा?
साडे



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

कोड पूरी तरह से सही नहीं हो सकता है क्योंकि मैं आमतौर पर पोपेन या विंडोज का उपयोग नहीं करता हूं, लेकिन विचार देना चाहिए। यह अच्छी तरह से हो सकता है कि त्रुटि संदेश त्रुटि स्ट्रीम पर है।


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

1
कृपया इस बात की व्याख्या जोड़ें कि आपका कोड इस प्रश्न को हल क्यों करता है।
आरजे

यह पोस्ट मूल रूप से * .exe फ़ाइल को निष्पादित कर रही है क्योंकि आप विंडोज़ .bat फ़ाइल का उपयोग कर रहे हैं।
सम्वत।

2

पायथन 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 का उपयोग कर साजिश रच रहा है:

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

विभिन्न समाधानों के भार हैं, और परिणाम दृढ़ता से इस पर निर्भर करेंगे:

  • आप जिस OS का उपयोग कर रहे हैं: Windows, Cygwin, Linux, MacOS
  • अजगर संस्करण आप उपयोग कर रहे हैं: पायथन 2 या पायथन 3 एक्स

जैसा कि मैंने कुछ चीजों की खोज की है जो केवल विंडोज में काम करने के लिए दावा किया जाता है, शायद इसलिए नहीं कि मैं सिग्विन का उपयोग करता हूं जो विंडोज पथ से निपटने के लिए ओएस तरीके को आउटसोर्स कर रहा है। अन्य चीजें केवल शुद्ध * निक्स आधारित ओएस या पायथन 2 या 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 विंडोज में ?

A: क्योंकि यदि आप किसी नई फ़ाइल के परिणामों को देखना चाहते हैं, तो एक्सप्लोरर स्वचालित रूप से उस फ़ाइल प्रकार के लिए आपके द्वारा सेट किए गए डिफ़ॉल्ट विंडो प्रोग्राम के साथ फ़ाइल को खोल देगा। तो उपयोग करने के लिए डिफ़ॉल्ट प्रोग्राम को फिर से निर्दिष्ट करने की आवश्यकता नहीं है।


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 रूटिमेज मेरे कोड के लिए है।


क्या आप एक समापन "में भूल गए os.system?
सूरज राव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.