我编写了一个名为plot_ts_ex
的python函数,它接受两个参数ts_file
和ex_file
(该函数的文件名为pism_plot_routine
(。我想从终端的bash脚本中运行这个函数。当我不在bash脚本中使用变量时,直接传递函数参数(在本例中为ts_file = ts_g10km_10ka_hy.nc
和ex_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_name
是sys.arv[1]
,ex_name
是sys.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
。