我正在编写一个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
答案 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)
除非使用 Python 对原始数据进行某种操作,否则无需导入任何内容。答案可能是蹩脚的:
myvar=$(python - <<< "print 'second'") ; echo $myvar
假设由于某种原因需要 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)])
但这只是暂时的解决方法。其他解决方案则更符合您的需求。 希望我能提供帮助!