2010-10-14 15 views
8

मैं एक कार्यक्रम की स्थापना कर रहा हूँ हमारे स्कूलों प्रॉक्सी करने के लिए अपने कंप्यूटर से कनेक्ट करने और वर्तमान में कुछ इस तरह है:लिनक्स पर पायथन में 'निर्यात' के साथ सबप्रोसेस मॉड्यूल त्रुटियां?

import subprocess 
import sys 

username = 'fergus.barker' 
password = '*************' 
proxy = 'proxy.det.nsw.edu.au:8080' 
options = '%s:%[email protected]%s' % (username, password, proxy) 

subprocess.Popen('export http_proxy=' + options) 

लेकिन चल रहा है पर मैं:

Traceback (most recent call last): 
File "school_proxy_settings.py", line 19, in <module> 
subprocess.Popen('export http_proxy=' + options) 
File "/usr/lib/python2.6/subprocess.py", line 621, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.6/subprocess.py", line 1126, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

हो रहा कृपया लोग क्यों है ?

उत्तर

6

समस्या यह है कि export वास्तविक आदेश या फ़ाइल नहीं है। यह bash और sh जैसे गोले के लिए अंतर्निहित कमांड है, इसलिए जब आप subprocess.Popen का प्रयास करते हैं तो आपको अपवाद मिलेगा क्योंकि यह export कमांड नहीं ढूंढ सकता है। डिफ़ॉल्ट रूप से Popen एक नई प्रक्रिया को बढ़ाने के लिए os.execvp() करता है, जो आपको खोल intrinsics का उपयोग करने की अनुमति नहीं देगा।

आप ऐसा कुछ कर सकते हैं, हालांकि आपको अपनी कॉल Popen पर बदलनी है।

http://docs.python.org/library/subprocess.html

आप इसे खोल आदेशों का उपयोग करने के लिए shell=True निर्दिष्ट कर सकते हैं।

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

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

Popen(['/bin/sh', '-c', args[0], args[1], ...])

3

export आपके सिस्टम पर एक अलग द्विआधारी नहीं है,: यह popen के बराबर होता है कहने के लिए है। उदाहरण के लिए, अपने सिस्टम पर which rm का उपयोग करने का प्रयास करें। आपको शायद कुछ ऐसा दिखाई देगा:

[21:16:28] ~ $ which rm 
/bin/rm 

अब which export का उपयोग करने का प्रयास करें। तो आप वास्तव में डिफ़ॉल्ट रूप से एक export प्रक्रिया/उपप्रक्रिया आह्वान नहीं कर सकते

[21:16:37] ~ $ which export 
/usr/bin/which: no export in (/usr/lib/qt-3.3/bin:/usr/kerberos/sbin: 
/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin: 
/usr/local/sbin:/usr/sbin:/sbin:/home/carter/bin) 

: आप की तरह कुछ मिल जाएगा। आप इसके बजाय os.putenv() और os.environ() देख सकते हैं।

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