2013-05-08 10 views
9

कुछ कार्यात्मक परीक्षणों के लिए, मैं पाइथन के subprocess.call (या check_call का उपयोग करके प्रोजेक्ट निर्देशिका से सीधे कुछ उपयोगिताओं का आह्वान करता हूं जो बाद वाले को आमंत्रित करता है)। यह अच्छी तरह से काम करता है जब पुस्तकालय (विशेष रूप से PyYAML) वैश्विक स्तर पर स्थापित होते हैं। वर्चुअलएन्व में चलना, जैसे ट्रैविस-सीआई के तहत, समस्याएं पैदा करता है, खासकर यदि वर्चुअलएन्व पायथन 3.x चला रहा है और वैश्विक पायथन 2.7 है।वर्चुअलनव और सबप्रोसेस.call() 2.7/3.3 पर्यावरण

यदि दोनों पायथन 2.7 हैं, तो मुझे अभी भी env तर्क subprocess.call का उपयोग करके वर्चुअलएव के भीतर PyYAML के स्थान को इंजेक्ट करना था, ताकि आयातकर न हो। हालांकि, वर्चुअलनव 3.x है जब यह काम नहीं करता है। यह virtualenv बाहर लाया उपयोगिता रन प्रतीत होता है क्योंकि इसके sys.path इस प्रकार दिखता है:

'/home/travis/build/jmafc/Pyrseas/pyrseas', '/usr/local/lib/python2.7/dist-packages/distribute-0.6.35-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/pip-1.3.1-py2.7.egg', '/home/travis/build/jmafc/Pyrseas', '/home/travis/virtualenv/python3.3/lib/python3.3/site-packages', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info', '/usr/lib/python2.7/dist-packages'] 

सूचना 2.7 और 3.3 रास्तों में से मिश्रण, बाद स्पष्ट रूप से इंजेक्शन की जा रही जैसा कि ऊपर उल्लेख।

क्या virtualenv या subprocess फ़ंक्शंस में कुछ तरीका है यह सुनिश्चित करने के लिए कि उपप्रोसेसर वर्चुअलएन्व "अंदर" चलाता है?

+0

क्या आप हमें subprocess.call के लिए अपना कोड दिखा सकते हैं? – jterrace

+0

आप 'dbMigrateTestCase.create_yaml'' (उदाहरण के लिए) में कोड [यहां] (https://github.com/jmafc/Pyrseas/blob/master/pyrseas/testutils.py) पा सकते हैं। –

उत्तर

19

यदि आप अपने पर्यावरण चर की प्रतिलिपि में गुजरते हैं और वर्तमान पाइथन दुभाषिया को उपप्रोसेसर के लक्ष्य के रूप में उपयोग करते हैं, तो वर्चुअलनव पर्यावरण को संरक्षित किया जाना चाहिए। कुछ ऐसा:

subprocess.call([sys.executable, 'yourscript.py'], env=os.environ.copy()) 
+0

धन्यवाद, ऐसा लगता है कि मेरे वर्चुअलएव में चाल है। अब मुझे देखना होगा कि ट्रैविस-सीआई में इसका किराया कैसा है। –