从bash向python函数传递多个参数(在变量中)



我编写了一个名为plot_ts_ex的python函数,它接受两个参数ts_fileex_file(该函数的文件名为pism_plot_routine(。我想从终端的bash脚本中运行这个函数。当我不在bash脚本中使用变量时,直接传递函数参数(在本例中为ts_file = ts_g10km_10ka_hy.ncex_file = ex_g10km_10ka_hy.nc(,如下所示:

#!/bin/sh
python -c 'import pism_plot_routine; pism_plot_routine.plot_ts_ex("ts_g10km_10ka_hy.nc", "ex_g10km_10ka_hy.nc")'

这与命令行中的Run函数类似。

但是当我为输入参数定义变量时,它不起作用:

#!/bin/sh 
ts_name="ts_g10km_10ka_hy.nc" 
ex_name="ex_g10km_10ka_hy.nc" 
python -c 'import pism_plot_routine; pism_plot_routine.plot_ts_ex("$ts_name", "$ex_name")'

它给出了错误:

FileNotFoundError: [Errno 2] No such file or directory: b'$ts_name'

然后,我发现了一个类似的问题,将一个参数从bash传递给一个python函数,而这个函数只有一个参数,我尝试了

#!/bin/sh
python -c 'import sys, pism_plot_routine; pism_plot_routine.plot_ts_ex(sys.argv[1])' "$ts_name" "$ex_name"

但这行不通。

那么,如何使用变量在bash脚本中为python函数传递2个参数呢?

当您使用单引号时,变量不会被扩展,您应该使用双引号:

#!/bin/sh 
ts_name="ts_g10km_10ka_hy.nc" 
ex_name="ex_g10km_10ka_hy.nc" 
python -c "import pism_plot_routine; pism_plot_routine.plot_ts_ex('$ts_name', '$ex_name')"

您也可以使用sys.argv,参数存储在列表中,因此ts_namesys.arv[1]ex_namesys.argv[2]:

#!/bin/sh 
ts_name="ts_g10km_10ka_hy.nc" 
ex_name="ex_g10km_10ka_hy.nc" 
python -c 'import sys, pism_plot_routine; pism_plot_routine.plot_ts_ex(sys.argv[1], sys.argv[2])' "$ts_name" "$ex_name"

您将值$ts_name作为字符串提供给python,bash不会对它做任何事情。您需要关闭',使其成为bash中的字符串,然后再次打开它,使其变成python中的字符串。

结果将是这样的:

#!/bin/sh 
ts_name="ts_g10km_10ka_hy.nc" 
ex_name="ex_g10km_10ka_hy.nc" 
python -c 'import pism_plot_routine; pism_plot_routine.plot_ts_ex("'$ts_name'", "'$ex_name'")'

对于这样的问题,使用一些较小的代码来测试它通常是很好的,我使用python3 -c 'print("${test}")'来计算它传递给python的内容,而不需要pism_plot

相关内容

  • 没有找到相关文章