如何将 Bash 变量传递给 Python?

Posted

技术标签:

【中文标题】如何将 Bash 变量传递给 Python?【英文标题】:How to pass a Bash variable to Python? 【发布时间】:2011-11-23 04:16:59 【问题描述】:

最终我明白了这一点并且它起作用了。

bash 脚本:

#!/bin/bash
#$ -V
#$ -cwd
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y
#$ -S /bin/bash
#$ -l mem_free=4G


c=$SGE_TASK_ID
cd /home/xxx/scratch/test/
FILENAME=`head -$c testlist|tail -1`
python testpython.py $FILENAME

python 脚本:

#!/bin/python
import sys,os


path='/home/xxx/scratch/test/'
name1=sys.argv[1]
job_id=os.path.join(path+name1)
f=open(job_id,'r').readlines()
print f[1]

谢谢

【问题讨论】:

argparse 模块的哪一部分让您感到困惑? docs.python.org/dev/library/argparse.html。它有助于就您的代码遇到的问题提出更多具体问题。请使用argparse 发布代码并提出具体问题。 将其作为命令行参数传递,然后将其从 sys.argv 中拉出。 【参考方案1】:

导出的 bash 变量实际上是环境变量。您可以通过 os.environ 对象使用类似字典的界面来获取它们。请注意,Bash 中有两种类型的变量:当前进程的本地变量和子进程继承的变量。您的 Python 脚本是一个子进程,因此您需要确保 export 是您希望子进程访问的变量。

要回答您最初的问题,您需要先导出变量,然后使用 os.environ 从 python 脚本中访问它。

##!/bin/bash
#$ -V
#$ -cwd
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y
#$ -S /bin/bash
#$ -l mem_free=4G

c=$SGE_TASK_ID
cd /home/xxx/scratch/test/
export FILENAME=`head -$c testlist|tail -1`
chmod +X testpython.py
./testpython.py


#!/bin/python
import sys
import os

for arg in sys.argv:  
    print arg  

f=open('/home/xxx/scratch/test/' + os.environ['FILENAME'],'r').readlines()
print f[1]

或者,您可以将变量作为命令行参数传递,这就是您的代码现在正在执行的操作。在这种情况下,您必须查看sys.argv,这是传递给脚本的参数列表。它们出现在sys.argv 中的顺序与您在调用脚本时指定的顺序相同。 sys.argv[0] 始终包含正在运行的程序的名称。后续条目包含其他参数。 len(sys.argv) 表示脚本接收到的参数数量。

#!/bin/python
import sys
import os

if len(sys.argv) < 2:
    print 'Usage: ' + sys.argv[0] + ' <filename>'
    sys.exit(1)

print 'This is the name of the python script: ' + sys.argv[0]
print 'This is the 1st argument:              ' + sys.argv[1]

f=open('/home/xxx/scratch/test/' + sys.argv[1],'r').readlines()
print f[1]

【讨论】:

必须编辑第一行以使其准确。 未导出 shell 变量当然不是环境变量。【参考方案2】:

在你的脚本中使用它(根据 Aarons 的建议编辑):

def main(args):
    do_something(args[0])


if __name__ == "__main__":
    import sys
    main(sys.argv[1:])

【讨论】:

bool(sys.argv) 始终为 Truesys.argv[0] 将包含脚本名称。 如果您要将参数传递给函数,更常见的是截断脚本名称,这样函数不需要知道就可以忽略它。即main(sys.argv[1:]) 任何你想要的,我只是向你展示如何抓住你的问题所要求的论点 如果你问了一个问题,然后得到一个回答那个问题的答案,那么线程就完成了。你不应该去,好吧,现在我得到了一个不同的错误,帮我解决这个问题。这不是 *** 的目的 如果我将列表作为参数传递,它会处理吗? @MattoTodd【参考方案3】:

看看parsing Python arguments。你的 bash 代码会很好,只需要编辑你的 Python 脚本来接受参数。

【讨论】:

抱歉还是一头雾水……谁能把 sys.argv 添加到 python 代码中? 您需要添加import sys 并更改python 脚本以使用args[1] 之类的参数接受参数【参考方案4】:

脚本的命令行参数以sys.argv 列表的形式提供。

【讨论】:

以上是关于如何将 Bash 变量传递给 Python?的主要内容,如果未能解决你的问题,请参考以下文章

将bash变量传递给python命令[关闭]

通过回声管道将python变量(字符串)传递给bash命令[重复]

如何将数组传递给 Bash 函数?

将 bash 变量传递给 jq

将变量传递给Linux bash命令参数

如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)