开发者

Passing bash variables to a script?

What's the best way to pass bash variables to a python script. I'd like to do something like the following:

$cat test.sh
#!/bin/bash

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

$cat test.py
#!/bin/python

def printfoo(str):
    print str

When I try running the bash script, I get a syntax error:

  File "<string>", line 1
    import test; test.printfoo($foo)
            开发者_开发技巧                   ^
SyntaxError: invalid syntax


You can use os.getenv to access environment variables from Python:

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

However, in order for environment variables to be passed from Bash to any processes it creates, you need to export them with the export builtin:

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

As an alternative to using environment variables, you can just pass parameters directly on the command line. Any options passed to Python after the -c command get loaded into the sys.argv array:

# 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


In short, this works:

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

Update:

If you think the string may contain single quotes(') as said by @Gordon in the comment below, You can escape those single quotes pretty easily in bash. Here's a alternative solution in that case:

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


Do it with argv handling. This way you don't have to import it then run it from the interpreter.

test.py

import sys

def printfoo(string):
    print string

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

python test.py testingout


You have to use double quotes to get variable substitution in bash. Similar to PHP.

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

Thus, this should work:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜