2017-04-23 68 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变量中。不过,如果你想返回更复杂的东西,它会变得有点麻烦。