我编写了一个名为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 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'然后,我发现了一个类似的问题,passing an argument to a python function from 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个参数呢?
发布于 2022-02-25 13:03:37
当您使用单引号时,变量将不会展开,您应该使用双引号:
#!/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"发布于 2022-02-25 13:01:50
如果将值$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的麻烦。
https://stackoverflow.com/questions/71266145
复制相似问题