从Python传递变量到Bash

10

我正在编写一个 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

你的Python脚本无法更改Bash的环境(这里是变量myvar)。 - Cyrus
为什么你想运行 Python 代码时要创建 Bash 脚本?可以使用 BASH 语法或 Python。你需要的东西不是编程工作方式。 - Moinuddin Quadri
1
顺便提一下--假设您希望将Python源代码按原样使用(不受bash shell的参数扩展、命令替换等影响),则必须将heredoc分界符用引号括起来,例如'EOF'。这不会影响您示例中的代码,但这是使用heredocs时养成的好习惯。 - Chris Johnson
5个回答

5
  1. Unless Python is used to do some kind of operation on the original data, there's no need to import anything. The answer could be as lame as:

     myvar=$(python - <<< "print 'second'") ; echo "$myvar"
    
  2. Suppose for some reason Python is needed to spit out a bunch of bash variables and assignments, or (cautiously) compose code on-the-fly. An eval method:

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

3

补充 Cyrus's comment 的有用信息,你就是不能这样做。原因如下:

设置环境变量只对当前进程以及它启动的任何子进程有效。 os.environ 只会在运行要执行命令的 shell 中设置它。当该命令完成时,shell 就会消失,环境变量也会消失。

你可以使用一个 shell 脚本来实现这个功能,并且只需在当前 shell 上运行 source 命令即可。


2
有几种“不正规”的方法可以完成这样的事情。以下是一个示例:
#!/bin/bash

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

echo "$myvar"

Python进程的输出存储在bash变量中。如果你想返回更复杂的内容,会有些混乱。


1

你可以让Python返回值并将其传递给Bash:

pfile.py

print(100)

bfile.sh

var=$(python pfile.py)
echo "$var"

输出:100


0

好吧,也许这并不是你想要的,但一个选择是使用 subprocess 在 Python 中运行其他批处理命令。

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

但这只是一个临时解决方案。其他的解决方案更符合您的需求。 希望我能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接