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

passing multiple arguments to a python function from bash (in variables)

我写了一个名为 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 function from the command line 中的类似,有效。

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

#!/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'

然后我发现了一个类似的问题 for a python function with only an argument and I tried

#!/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 个参数?

您将 $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.

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

#!/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"