python
  • shell
  • subprocess
  • os.system
  • 2017-05-05 62 views 1 likes 
    1

    我想用shell命令從它中提取一個變量,我想在我的python程序的其餘部分使用它。例如,此代碼嘗試使用subprocess.callos.system。前者給了我一個錯誤,而後者不產生任何東西,但如果我在shell命令中不使用變量,兩者都可以正常工作。Python不執行使用變量的shell命令

    import subprocess 
    import os 
    # ... 
    
    x="05/May/2017" 
    
    print 'Date =',x 
    
    subprocess.call(['echo Hello World from method 1'], shell=True) 
    os.system('echo Hello World from method 2') 
    
    print "Month from method 1 =" 
    subprocess.call(['echo $x | cut -f2 -d/']) 
    
    
    print "Month from method 2 =" 
    m=os.system('echo $x | cut -f2 -d/') 
    print m 
    

    問題在哪裏,我該如何克服這個問題?

    +0

    'x'是你的python腳本的一個變量。它不是一個環境變量。因此,在shell中執行時,它會失敗 – kuro

    +0

    如何 - 'os.system('echo%s | cut -f2 -d /'%x)'? – kuro

    +1

    這裏沒有任何理由需要外部過程。 'month = x.split('/')[1]'。有沒有更好的例子可以證明「subprocess.call」的正確使用? – chepner

    回答

    0

    問題是,python變量沒有傳遞給子進程(shell命令)。

    簡單的解決方案:

    m=subprocess.getoutput('echo %s | cut -f2 -d/' % (x,))

    'echo %s | cut -f2 -d/' % (x,)將首先蟒蛇替換「%s」與變量x的內容,然後調用 subprocess.getoutput('echo 05/May/2017 | cut -f2 -d/')

    +0

    該方法是正確的,但這仍然是一個不正確的使用'調用'。 – chepner

    +0

    這給我一個錯誤。 :( – hbaromega

    +0

    好的,如果我們在其中添加'shell = True',它就可以工作。但是,我無法爲其指定變量'm',如原始問題所示。 – hbaromega

    0

    如果你想傳遞一個環境變量到一個子過程,你必須明確地將它添加到os.environ,如下所示。另一種選擇是創建一個新環境並將其傳遞給.call

    import subprocess; 
    import os; 
    os.environ['foo'] = "bar"; 
    subprocess.call('echo $foo', shell=True); 
    

    在上述情況下,還需要shell=True,否則subprocess.call將尋找字面上叫echo $foo的可執行文件。

    當然,我們可以手動設置命令行參數:

    foo = "bar"; 
    subprocess.call(['echo', foo]); 
    

    ,但那就不是一個環境變量。

    至於你正在做的實際調用,我希望你只是爲了實驗而運行cut作爲子進程,像這樣的字符串處理最好在Python腳本中完成。

    +0

    糟糕,我錯過了'shell =真的'在我的第二個'subprocess.call'行。一旦我把它刪除了錯誤。 – hbaromega

    相關問題