2011-08-22 19 views
15

का उपयोग करने के लिए मेरे पास एक पाइथन स्क्रिप्ट है जिसे एक ही निर्देशिका में एक और पायथन स्क्रिप्ट का आह्वान करने की आवश्यकता है। मैं ऐसा किया:पायथन सबप्रोसेस कॉल का उपयोग करके पाइथन स्क्रिप्ट

from subprocess import call 
    call('somescript.py') 

मैं निम्न त्रुटि

call('somescript.py') 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
raise child_exception 

OSError: [errno 2] इस तरह के कोई फ़ाइल या निर्देशिका

मैं एक ही फ़ोल्डर में स्क्रिप्ट somescript.py है हालांकि। क्या मुझसे कोई चूक हो रही है। धन्यवाद

+1

आपके 'पथ' में ''' है? क्या somescript.py निष्पादन योग्य है? – geoffspear

+1

आप इसे निष्पादित करने का प्रयास क्यों कर रहे हैं? क्यों नहीं 'आयात'? – tMC

+0

@wooble हाँ। यह पथ में और निष्पादन योग्य भी है। हाँ। मैं इसे भी आयात कर सकता हूं। लेकिन फिर भी यह जानना अच्छा होगा कि मैं यहां क्या कर रहा हूं क्योंकि मुझे लगता है कि यह काम करना है। – user514946

उत्तर

1

subprocess.callsubprocess.Popen के समान तर्कों की अपेक्षा करता है - यह स्ट्रिंग्स (सी में argv) की बजाय एक स्ट्रिंग की एक सूची है। यह संभव है कि आपके बच्चे की प्रक्रिया पैरामीटर "ओ", "एम", "ई" पैरामीटर के साथ "एस" चलाने का प्रयास करें ...

0

सबप्रोसेस कॉल एक बहुत ही शाब्दिक दिमागी सिस्टम कॉल है। इसका उपयोग किसी भी सामान्य प्रक्रिया के लिए किया जा सकता है ... इसलिए यह नहीं पता कि पाइथन स्क्रिप्ट के साथ स्वचालित रूप से क्या करना है।

कोशिश

call ('python somescript.py') 

है कि अगर काम नहीं करता है, तो आप एक निरपेक्ष पथ की कोशिश करना चाहते हो सकता है, और/या अपने अजगर स्क्रिप्ट ... ठेठ मज़ा सामान पर जांच अनुमतियाँ।

जे

0

पहले, जांच अगर somescript.py निष्पादन योग्य है और #!/usr/bin/python की तर्ज पर कुछ के साथ शुरू होता है। यदि यह किया जाता है, तो आप subprocess.call('./somescript.py') का उपयोग कर सकते हैं।

या जैसा कि कोई अन्य उत्तर बताता है, आप subprocess.call(['python', 'somescript.py']) कर सकते हैं।

+0

बस एक यादृच्छिक सूचक: मैंने इसे #!/Usr/bin/env पायथन का उपयोग करने के लिए उपयोगी पाया है ताकि यदि कोई मॉड्यूल लोड हो गया हो, तो आप स्वचालित रूप से लोड किए गए पायथन संस्करण के साथ चल रहे हैं। – Vorticity

5

विंडोज़? यूनिक्स?

#!/usr/bin/env python 

स्क्रिप्ट की पहली पंक्ति और के रूप में:

chmod u+x script.py 
कमांड लाइन पर

या

call('python script.py'.split()) 

रूप

यूनिक्स काम करने के लिए एक मामला और कार्यकारी विशेषता की आवश्यकता होगी पहले उल्लेख किया गया है।

यदि आप shell=True parameter को "कॉल" कॉल में जोड़ते हैं तो विंडोज़ को काम करना चाहिए।

+5

'कॉल (' पायथन script.py ')' गैर-विंडोज सिस्टम पर काम नहीं करेगा। यह 'check_call ([sys.executable या 'पायथन', '/path/to/script.py'] होना चाहिए)'। और यदि आपको 'पायथन' निष्पादन योग्य निर्दिष्ट किया गया है तो आपको शेबैंग और निष्पादन योग्य अनुमतियों की आवश्यकता नहीं है। – jfs

+0

sys.executable सभी सनी स्थितियों के लिए पर्याप्त होना चाहिए। –

2

यदि आप लिनक्स/यूनिक्स पर हैं तो आप पूरी तरह से कॉल() से बच सकते हैं और पाइथन निष्पादन योग्य और उसके पर्यावरण का एक बिल्कुल नया उदाहरण निष्पादित नहीं कर सकते हैं।

import os 

cpid = os.fork() 
if not cpid: 
    import somescript 
    os._exit(0) 

os.waitpid(cpid, 0) 

FWIW

+1

केवल * निक्स: फोर्क का उपयोग करके आप मूल प्रक्रिया पायथन दुभाषिया (सभी मौजूदा आयातों के साथ ...) से प्राप्त होंगे। यदि आप एक नया नया व्याख्याता चाहते हैं तो यह एक अच्छा विकल्प नहीं है। Diff कांटा/निष्पादन यूनिक्स सिस्टम कॉल देखें। –

+0

'subprocess' मॉड्यूल POSIX सिस्टम पर 'फोर्क/exec' और Windows पर' CreateProcess' का उपयोग करता है। यदि आप एक पायथन स्क्रिप्ट चलाने के लिए चाहते हैं तो सीधे 'कांटा' का उपयोग करने की आवश्यकता नहीं है। – jfs

17

यदि 'somescript.py' कुछ आप सामान्य रूप से कमांड लाइन (अर्थात $: somescript.py काम करता है) से सीधे निष्पादित कर सकता है नहीं है, तो आप इसे सीधे कॉल का उपयोग कर कॉल नहीं कर सकते।

याद रखें कि पॉपन काम करने का तरीका यह है कि पहला तर्क वह प्रोग्राम है जो इसे निष्पादित करता है, और शेष उस कार्यक्रम में दिए गए तर्क हैं। इस मामले में, कार्यक्रम वास्तव में पायथन है, आपकी स्क्रिप्ट नहीं।

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...]). 

यह सही ढंग से अजगर दुभाषिया कॉल करता है और यह बताता है दिए गए तर्कों के साथ अपनी स्क्रिप्ट निष्पादित करने के लिए: तो निम्नलिखित के रूप में आप उम्मीद कर काम करेंगे।

ध्यान दें कि यह ऊपर सुझाव से अलग है:

subprocess.call(['python somescript.py']) 

कि कार्यक्रम, अजगर somscript.py कहा जाता है जो स्पष्ट रूप से मौजूद नहीं है पर अमल करने की कोशिश करेंगे।

call('python somescript.py', shell=True) 

भी काम करेंगे, लेकिन इनपुट कॉल करने के लिए के रूप में तार का उपयोग कर पार मंच नहीं है, खतरनाक अगर आप स्ट्रिंग का निर्माण एक नहीं हैं, और आम तौर पर यदि संभव हो परहेज किया जाना चाहिए है।

+0

मेरे पास यह समस्या है, लेकिन स्क्रिप्ट का पथ मेरी बेसआरसी फ़ाइल में है, इसलिए मैं इसे टर्मिनल से माइस्क्रिप्ट (तर्क) के रूप में कॉल कर सकता हूं। जब मैं उपरोक्त पायथन से करने की कोशिश करता हूं, तो मुझे कोई त्रुटि नहीं मिलती है? – rankind

0
def main(argv): 
    host = argv[0] 
    type = argv[1] 
    val = argv[2] 

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True) 
    out = ping.communicate()[0] 
    output = str(out) 
    print output 
2

इसे देखें।

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f: 
    call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f) 
1

क्या एक समारोह में कार्यक्षमता लपेट

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 

या बेहतर अभी भी साथ कुछ गड़बड़ है, उदाहरण के लिए बाज़, तो यह करो।

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 
somescript.baz() 

पाइथन प्रक्रियाओं या फोर्किंग शुरू करने वाली बहुत सी स्क्रिप्ट्स प्रतीत होती है, क्या यह एक आवश्यकता है?

संबंधित मुद्दे