2009-05-25 16 views
9

मैं अपने डिफ़ॉल्ट खोल के रूप में/bin/tcsh का उपयोग कर रहा हूं।os.system() execute कमांड जिसके अंतर्गत linux खोल?

हालांकि, tcsh शैली कमांड os.system ('setenv VAR val') मेरे लिए काम नहीं करता है। लेकिन ओएससिस्टम ('निर्यात वीएआर = वैल') काम करता है।

तो मेरे सवाल है कि कैसे मैं जो खोल के तहत os.system() रन कमांड पता कर सकते हैं?

उत्तर

5

os.system() सिर्फ system() सिस्टम कॉल कॉल ("man 3 system")। अधिकांश * निक्स पर इसका मतलब है कि आपको /bin/sh मिलते हैं।

ध्यान दें कि export VAR=val तकनीकी रूप से मानक वाक्यविन्यास नहीं है (हालांकि bash इसे समझता है, और मुझे लगता है कि ksh भी करता है)। यह उन सिस्टम पर काम नहीं करेगा जहां /bin/sh वास्तव में बोर्न शैल है। उन सिस्टमों पर आपको अलग-अलग कमांड के रूप में निर्यात और सेट करने की आवश्यकता है। (यह bash के साथ भी काम करेगा।)

9

इन दिनों आपको os.system() के बजाय Subprocess मॉड्यूल का उपयोग करना चाहिए। वहां प्रलेखन के अनुसार, डिफ़ॉल्ट खोल /bin/sh है। मेरा मानना ​​है कि os.system() वैसे ही काम करता है।

संपादित करें: मुझे यह भी उल्लेख करना चाहिए कि उपप्रोसेसर मॉड्यूल आपको env पैरामीटर के माध्यम से निष्पादन प्रक्रिया में उपलब्ध पर्यावरण सेट करने की अनुमति देता है।

+0

वास्तव में,/बिन/श (जो लगभग हमेशा बोर्न शेल का कुछ रूप है) लगभग हमेशा होता है जब कुछ भी * निक्स से संबंधित योग्यता के बिना "खोल" कहता है। यह भी ध्यान देने योग्य हो सकता है कि यदि आपको वास्तव में किसी विशिष्ट गैर-बोर्न शैल के नीचे कुछ स्निपेट निष्पादित करने की आवश्यकता है, तो आप फ़ंक्शन को अपने/tcsh sncet जैसे 't pathsh /c/tcsh -c "जैसे कुछ पास कर सकते हैं। –

2

यदि आपका आदेश एक खोल फ़ाइल है, और फ़ाइल निष्पादन योग्य है, और फ़ाइल "#!" से शुरू होती है, तो आप अपना खोल चुन सकते हैं।

#!/bin/zsh 
Do Some Stuff 

आपको यह फ़ाइल लिख सकते हैं और उसके बाद subprocess.Popen(filename,shell=True) साथ निष्पादित और आप किसी भी खोल आप चाहते हैं उपयोग करने में सक्षम हो जाएगा।

इसके अलावा, thisos.system और subprocess.Popen पढ़ने के लिए सुनिश्चित रहें।

+0

मैं यह इंगित करने जा रहा था कि खोल = सत्य आवश्यक नहीं है, लेकिन फिर यह मेरे लिए हुआ: क्या यह वह शैल है जो शेबांगों की व्याख्या करने और तदनुसार अभिनय करने के लिए जिम्मेदार है? –

+0

सही। खोल "जादू" बाइट्स "#!" की व्याख्या करता है यह देखने के लिए कि वास्तव में इस फ़ाइल का उपयोग करके अन्य खोल क्या होना चाहिए। –

10

बस Executing BASH from Python पढ़ रहा था, फिर 17.1. subprocess — Subprocess management — Python v2.7.3 documentation, और मैंने executable तर्क देखा; और यह काम करने लगता है:

$ python 
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> print os.popen("echo $0").read() 
sh 
>>> import subprocess 
>>> print subprocess.call("echo $0", shell=True).read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
/bin/bash 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh: Syntax error: "(" unexpected 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
TEST 

आशा इस कोई मदद करता है,
चीयर्स!

+0

मैं वह हूं। यह वही है जिसे मैं देख रहा था। यह नोट करने के लिए धन्यवाद :) – Thorn

+0

हां, यह बहुत सच है जब कोई एक कमांड से stdout को टीई का उपयोग करके एकाधिक कमांड में पाइप कर रहा है, जैसे 'कमांड आउट = stdout | टीई> (कमांड_1 = stdin में)> (command_2 में = stdin) '। इसे पोस्ट करने के लिए धन्यवाद, अंगूठे ऊपर ~ – CheeHow

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