2017-04-23 112 views
4

我正在編寫一個嵌入了小型python腳本的bash腳本。我想從python傳遞一個變量到bash。經過幾次搜索,我只找到了基於os.environ的方法。將變量從Python傳遞到Bash

我只是不能讓它工作。這是我的簡單測試。

#!/bin/bash 

export myvar='first' 

python - <<EOF 
import os 
os.environ["myvar"] = "second" 
EOF 

echo $myvar 

我,它預計到輸出second,但它仍然輸出first。我的腳本有什麼問題?也有沒有辦法通過變量沒有export


摘要

感謝所有的答案。這是我的總結。

嵌入在bash中的python腳本將作爲子進程運行,它根據定義不能影響父bash環境。

解決的辦法是從python傳遞出任務字符串,然後在bash中傳遞eval

一個例子是

#!/bin/bash 
a=0 
b=0 

assignment_string=$(python -<<EOF 
var1=1 
var2=2 
print('a={};b={}'.format(var1,var2)) 
EOF 
) 

eval $assignment_string 

echo $a 
echo $b 
+0

你的Python腳本不能改變bash的環境(在此變量MYVAR)。 – Cyrus

+0

爲什麼當你想運行python代碼時創建bash腳本?使用BASH語法或Python。你需要的不是編程的工作方式。 –

+1

注意事項 - 假設您希望您的Python源代碼按原樣使用(不受bash shell的參數擴展,命令替換等),則必須將heredoc分隔符用引號括起來,如「EOF」。這不會影響您示例中的代碼,但這對於融入heredocs是一個好習慣。 –

回答

1
  1. 除非的Python是用來做一些操作上的原始數據,沒有必要進口任何東西。答案可能是因爲跛腳爲:

    myvar=$(python - <<< "print 'second'") ; echo $myvar 
    
  2. 假如由於某種原因需要的Python吐出一堆bash變量和任務,或(謹慎)組成的即時代碼。一個eval方法:

    myvar=first 
    eval $(python - <<< "print('myvar=second')") 
    echo $myvar 
    
2

補充問題的有用Cyrus's comment,你只是不能做到這一點。這是爲什麼,

設置一個環境變量只爲當前進程和它啓動的任何子進程設置它。 os.environ將僅爲正在運行的shell執行您提供的命令進行設置。當該命令結束時,shell會消失,環境變量也會消失。

你幾乎可以做一個shell腳本本身,只是,以反映它在當前的shell。

1

有幾個「髒」的方法來完成這樣的事情。以下是一個示例:

#!/bin/bash 

myvar=$(python - <<EOF 
print "second" 
EOF 
) 

echo $myvar 

python進程的輸出存儲在bash變量中。不過,如果你想返回更復雜的東西,它會變得有點麻煩。