将变量从Python传递给Bash

时间:2017-04-23 15:22:47

标签: python bash

我正在编写一个bash脚本,其中嵌入了一个小的python脚本。我想将一个变量从python传递给bash。经过一些搜索后,我只找到了基于os.environ的方法。

我无法让它发挥作用。这是我的简单测试。

#!/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

5 个答案:

答案 0 :(得分:2)

补充有用的Cyrus's comment,您只需无法执行此操作。这就是原因,

设置环境变量仅为当前进程及其启动的任何子进程设置它。 os.environ将仅为正在运行的shell设置它以执行您提供的命令。当该命令完成时,shell就会消失,环境变量也会消失。

您可以使用shell脚本本身,只需 source 就可以在当前shell上反映它。

答案 1 :(得分:1)

有一些“肮脏”的方法来完成这样的事情。这是一个例子:

#!/bin/bash

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

echo $myvar

python进程的输出存储在bash变量中。但是,如果你想要返回更复杂的东西,它会变得有点混乱。

答案 2 :(得分:1)

  1. 除非使用 Python 对原始数据进行某种操作,否则无需导入任何内容。答案可能是蹩脚的:

    myvar=$(python - <<< "print 'second'") ; echo $myvar
    
  2. 假设由于某种原因需要 Python 来吐出一堆bash变量和赋值,或者(谨慎地)即时编写代码。 eval方法:

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

答案 3 :(得分:0)

您可以使python返回val并将其传递给bash:

pfile.py

print(100)

bfile.sh

var=`python pfile.py`

echo $var

输出:100

答案 4 :(得分:0)

好吧,这可能不是您想要的,但是一个选项可以使用子进程在python中运行其他批处理命令

import subprocess
x =400
subprocess.call(["echo", str(x)])

但这只是暂时的解决方法。其他解决方案则更符合您的需求。 希望我能提供帮助!