将 bash 变量传递给脚本?

问题描述 投票:0回答:5

将 bash 变量传递给 python 脚本的最佳方法是什么。 我想做如下的事情:

$cat test.sh
#!/bin/bash

foo="hi"
python -c 'import test; test.printfoo($foo)'

$cat test.py
#!/bin/python

def printfoo(str):
    print str

当我尝试运行 bash 脚本时,出现语法错误:

  File "<string>", line 1
    import test; test.printfoo($foo)
                               ^
SyntaxError: invalid syntax
python bash
5个回答
14
投票

您可以使用

os.getenv
从 Python 访问环境变量:

import os
import test
test.printfoo(os.getenv('foo'))

但是,为了将环境变量从 Bash 传递到它创建的任何进程,您需要使用

export
内置:

导出它们
foo="hi"
export foo
# Alternatively, the above can be done in one line like this:
# export foo="hi"

python <<EOF
import os
import test
test.printfoo(os.getenv('foo'))
EOF

作为使用环境变量的替代方法,您可以直接在命令行上传递参数。 在

-c command
加载到
sys.argv
数组之后传递给 Python 的任何选项:

# Pass two arguments 'foo' and 'bar' to Python
python - foo bar <<EOF
import sys
# argv[0] is the name of the program, so ignore it
print 'Arguments:', ' '.join(sys.argv[1:])
# Output is:
# Arguments: foo bar
EOF

10
投票

简而言之,这有效:

...
python -c "import test; test.printfoo('$foo')"
...

更新:

如果您认为字符串可能包含单引号(

'
),正如@Gordon 在下面的评论中所说,您可以在 bash 中轻松转义这些单引号。在这种情况下,这是一个替代解决方案:

...
python -c "import test; test.printfoo('"${foo//\'/\\\'}"');"
...

3
投票

使用 argv 处理来完成。这样您就不必导入它然后从解释器运行它。

测试.py

import sys

def printfoo(string):
    print string

if __name__ in '__main__':
    printfoo(sys.argv[1])

python test.py testingout

1
投票

您必须使用双引号才能在 bash 中进行变量替换。与 PHP 类似。

$ foo=bar
$ echo $foo
bar
$ echo "$foo"
bar
$ echo '$foo'
$foo

因此,这应该有效:

python -c "import test; test.printfoo($foo)"

0
投票

如果在

python -c
之后使用单引号('),则可以在环境变量周围使用
'"'

#!/bin/bash
python -c 'import test; test.printfoo('"'$foo'"')'
© www.soinside.com 2019 - 2024. All rights reserved.