将多个参数从 bash 传递给 python 函数(在变量中)
passing multiple arguments to a python function from bash (in variables)
我写了一个名为 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'
然后我发现了一个类似的问题 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_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"
我写了一个名为 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'
然后我发现了一个类似的问题
#!/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_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"