2012-03-26 11 views
11

एक और तरीका रखें, क्या यह जानने का एक क्रॉस-प्लेटफ़ॉर्म तरीका है कि subprocess.Popen(file) द्वारा कौन सी फ़ाइल निष्पादित की जाएगी, इसे पहले निष्पादित किए बिना?क्या 'पायदान' के बराबर एक पायथन है

+2

https://github.com/amoffat/pbs/blob/master/pbs.py#L95 –

+0

डिफ़ॉल्ट रूप से, उपप्रक्रिया माता पिता की प्रक्रिया के वातावरण inherents। तो पाथ में किसी भी निष्पादन योग्य (या प्रश्न के समकक्ष ओएस) के लिए आपको स्थान निर्दिष्ट करने की आवश्यकता नहीं है। –

+0

@ जोशली दिखता है कि पीबीएस अब उपलब्ध नहीं है। – Joe

उत्तर

8

मेरा मानना ​​है कि अजगर पुस्तकालयों

>>> def which(pgm): 
    path=os.getenv('PATH') 
    for p in path.split(os.path.pathsep): 
     p=os.path.join(p,pgm) 
     if os.path.exists(p) and os.access(p,os.X_OK): 
      return p 


>>> os.which=which 
>>> os.which('ls.exe') 
'C:\\GNUwin32\\bin\\ls.exe' 
24

में कोई नहीं है अजगर 3.3 shutil.which() जोड़ा खोज निष्पादनयोग्य की एक पार मंच साधन उपलब्ध कराने के:

http://docs.python.org/3.3/library/shutil.html#shutil.which

वापसी पथ के लिए एक निष्पादन योग्य जो दिया जाएगा यदि दिया गया cmd कहा जाता है। अगर कोई cmd नहीं कहा जाएगा, तो कोई भी वापस नहीं।

नमूना कॉल:

>>> shutil.which("python") 
'/usr/local/bin/python' 

>>> shutil.which("python") 
'C:\\Python33\\python.EXE' 

दुर्भाग्य से, इस 2.7.x. बैकपोर्टेड नहीं किया गया है

+2

संस्करण 3.3 के शिलिल के कार्यान्वयन के लिए पायथन स्रोत। जो यहां है (केवल कुछ दर्जन लाइनें): http: // hg .python.org/cpython/file/6860263c05b3/Lib/shutil.py # l1068 – joemaller

+1

यदि आप पंक्ति 1110 को 'यदि कोई है ([cmd.lower()। endethwith (ext.lower()) को pathext में ext के लिए बदलते हैं] '(जेनरेटर को एक सूची में चालू करें) की तुलना में यह अजगर 2.7 में काम करेगा। – cdhagmann

+2

बैकपोर्ट यहां उपलब्ध है: https://github.com/mbr/shutilwhich –

7

अजगर 2 और 3 के लिए एक विकल्प:

from distutils.spawn import find_executable 

find_executable('python') # '/usr/bin/python' 

find_executable('does_not_exist') # None 

find_executable(executable, path=None) बस 'पथ' में सूचीबद्ध निर्देशिका में 'निष्पादन' खोजने की कोशिश करता। os.environ['PATH'] पर डिफ़ॉल्ट यदि 'पथ' None है। अगर नहीं मिला तो 'निष्पादन योग्य' या None का पूरा पथ लौटाता है।

ध्यान रखें कि which के विपरीत, find_executable वास्तव में यह जांच नहीं करता है कि परिणाम निष्पादन योग्य के रूप में चिह्नित किया गया है। यदि आप यह सुनिश्चित करना चाहते हैं कि subprocess.Popen फ़ाइल निष्पादित करने में सक्षम होगा, तो आप इसे अपने आप जांचने के लिए os.access(path, os.X_OK) पर कॉल करना चाहेंगे।


भी ध्यान रखने की, अजगर 3.3+ की shutil.which बैकपोर्टेड किया गया है और अजगर 2.6, 2.7 के लिए उपलब्ध कराया था और 3.x 3 पार्टी मॉड्यूल whichcraft के माध्यम से।

यह उपरोक्त गिटहब पेज (यानी pip install git+https://github.com/pydanny/whichcraft.git) या पायथन पैकेज इंडेक्स (यानी pip install whichcraft) के माध्यम से इंस्टॉलेशन के लिए उपलब्ध है। यह की तरह इस्तेमाल किया जा सकता है:

from whichcraft import which 

which('wget') # '/usr/bin/wget'