如何将 argv 输入从一个带参数的 python 脚本传递给一个不带参数的脚本?
How to pass argv inputs from one python script with parameters to one without?
我正在处理存储在 FITS 文件中的大型传感器数据结构,我使用 astropy 模块打开并读入这些文件。
为了进行分析,我编写了几个脚本(例如 analysis1.py
)以不同的方式处理这些数据——每个脚本都创建一个包含多个子图的图像文件。
现在我想创建一个 init.py
脚本来初始化文件名和几个用于分析的参数
init.py filename arg2 arg3 arg4
这个我想传递给所有下标,例如analysis1.py
#analysis1.py
from init import filename, arg2, arg3, arg4
# import everything else necessary
# do things with the data
# output picture as png-file
使用bash但没有像
一样再次明确输入这些作为参数
#!/bin/bash
# initialization of parameters and data read-in
python init.py filename arg2 arg3 arg4
# analysis scripts running in parallel using the parameters of init.py
python analysis1.py &
python analysis3.py &
我使用这种方式是因为我通常在 CPU 机器上工作,并且希望使用尽可能多的 threads/cores 以提高效率。
普通导入当然不行,因为argv
没有从上次运行
获取参数
import init
from sys import argv
print(argv)
#returns ['mypath/init.py']
我怎样才能做到这一点?
如果您使用所有输入参数调用 bash 脚本:
./mybash.sh filename arg2 arg3 arg4
然后您可以像这样编写 bash 脚本,将您的输入参数传递给所有脚本:
#!/bin/bash
# initialization of parameters and data read-in
python init.py
# analysis scripts running in parallel using the parameters of init.py
python analysis1.py &
python analysis3.py &
您的 init.py 将可以访问 sys.argv 中的参数:
# init.py
from sys import argv
print(argv)
# prints ['mypath/init.py', <filename>, <arg2>, <arg3>, <arg4>]
# everything else
您的分析脚本也一样:
# analysis1.py
from sys import argv
print(argv)
# prints ['mypath/analysis1.py', <filename>, <arg2>, <arg3>, <arg4>]
# everything else
编辑
如果目标是让 init.py 将初始输入参数带到 bash 脚本,更改它们,然后将这些更改后的值作为参数传递给分析脚本,那么您可以让 init.py 脚本将它们以例如 JSON 格式转储到标准输出,以便您的分析脚本可以在启动时解析它们。
为此,请更改 init.py 以将初始化参数转储到标准输出,例如:
# init.py
import json
from sys import argv
# assign your input parameters
init_filename = argv[1]
init_arg2 = argv[2]
init_arg3 = argv[3]
init_arg4 = argv[4]
# do some initialisation on your input parameters here
# dump your initialised parameters to stdout in json format
print(json.dumps([init_filename, init_arg2, init_arg3, init_arg4]))
然后让您的分析脚本在启动时解析 JSON 值:
# analysis1.py
import json
from sys import argv
print(json.loads(argv[1]))
# prints [<init_filename>, <init_arg2>, <init_arg3>, <init_arg4>]
# everything else
最后,将 init.py 脚本的 (JSON) 输出分配给一个变量,并将其传递给 bash 文件中的分析脚本:
#!/bin/bash
# initialization of parameters and data read-in
PARAMS=$(python init.py )
# analysis scripts running in parallel using the parameters dumped by init.py
python analysis1.py ''"$PARAMS"''
python analysis3.py ''"$PARAMS"''
你或许可以在没有 JSON 的情况下执行此操作,但你将不得不担心转储到 stdout 的文件名和参数中的转义空格和特殊字符。
正如 Kendas 所说,您必须将参数保存在磁盘上的某个地方。
这会起作用:
init.py
import sys
import pickle
def get_parms():
return pickle.load(open("init.dat","rb"))
if __name__ == "__main__":
myparms = sys.argv[:]
pickle.dump(myparms,open("init.dat","wb"))
analysis1.py
import init
myparms = init.get_parms()
print(myparms)
如果你运行 init.py
喜欢这样:
python init.py filename arg1 arg2 arg3
然后 analysis1.py
将产生此输出:
['(pathname)/init.py', 'filename', 'arg1', 'arg2', 'arg3']
您几乎肯定希望允许 analysis1.py
接受命令行参数作为对来自 init
.
的值的覆盖
我正在处理存储在 FITS 文件中的大型传感器数据结构,我使用 astropy 模块打开并读入这些文件。
为了进行分析,我编写了几个脚本(例如 analysis1.py
)以不同的方式处理这些数据——每个脚本都创建一个包含多个子图的图像文件。
现在我想创建一个 init.py
脚本来初始化文件名和几个用于分析的参数
init.py filename arg2 arg3 arg4
这个我想传递给所有下标,例如analysis1.py
#analysis1.py
from init import filename, arg2, arg3, arg4
# import everything else necessary
# do things with the data
# output picture as png-file
使用bash但没有像
一样再次明确输入这些作为参数#!/bin/bash
# initialization of parameters and data read-in
python init.py filename arg2 arg3 arg4
# analysis scripts running in parallel using the parameters of init.py
python analysis1.py &
python analysis3.py &
我使用这种方式是因为我通常在 CPU 机器上工作,并且希望使用尽可能多的 threads/cores 以提高效率。
普通导入当然不行,因为argv
没有从上次运行
import init
from sys import argv
print(argv)
#returns ['mypath/init.py']
我怎样才能做到这一点?
如果您使用所有输入参数调用 bash 脚本:
./mybash.sh filename arg2 arg3 arg4
然后您可以像这样编写 bash 脚本,将您的输入参数传递给所有脚本:
#!/bin/bash
# initialization of parameters and data read-in
python init.py
# analysis scripts running in parallel using the parameters of init.py
python analysis1.py &
python analysis3.py &
您的 init.py 将可以访问 sys.argv 中的参数:
# init.py
from sys import argv
print(argv)
# prints ['mypath/init.py', <filename>, <arg2>, <arg3>, <arg4>]
# everything else
您的分析脚本也一样:
# analysis1.py
from sys import argv
print(argv)
# prints ['mypath/analysis1.py', <filename>, <arg2>, <arg3>, <arg4>]
# everything else
编辑 如果目标是让 init.py 将初始输入参数带到 bash 脚本,更改它们,然后将这些更改后的值作为参数传递给分析脚本,那么您可以让 init.py 脚本将它们以例如 JSON 格式转储到标准输出,以便您的分析脚本可以在启动时解析它们。
为此,请更改 init.py 以将初始化参数转储到标准输出,例如:
# init.py
import json
from sys import argv
# assign your input parameters
init_filename = argv[1]
init_arg2 = argv[2]
init_arg3 = argv[3]
init_arg4 = argv[4]
# do some initialisation on your input parameters here
# dump your initialised parameters to stdout in json format
print(json.dumps([init_filename, init_arg2, init_arg3, init_arg4]))
然后让您的分析脚本在启动时解析 JSON 值:
# analysis1.py
import json
from sys import argv
print(json.loads(argv[1]))
# prints [<init_filename>, <init_arg2>, <init_arg3>, <init_arg4>]
# everything else
最后,将 init.py 脚本的 (JSON) 输出分配给一个变量,并将其传递给 bash 文件中的分析脚本:
#!/bin/bash
# initialization of parameters and data read-in
PARAMS=$(python init.py )
# analysis scripts running in parallel using the parameters dumped by init.py
python analysis1.py ''"$PARAMS"''
python analysis3.py ''"$PARAMS"''
你或许可以在没有 JSON 的情况下执行此操作,但你将不得不担心转储到 stdout 的文件名和参数中的转义空格和特殊字符。
正如 Kendas 所说,您必须将参数保存在磁盘上的某个地方。
这会起作用:
init.py
import sys
import pickle
def get_parms():
return pickle.load(open("init.dat","rb"))
if __name__ == "__main__":
myparms = sys.argv[:]
pickle.dump(myparms,open("init.dat","wb"))
analysis1.py
import init
myparms = init.get_parms()
print(myparms)
如果你运行 init.py
喜欢这样:
python init.py filename arg1 arg2 arg3
然后 analysis1.py
将产生此输出:
['(pathname)/init.py', 'filename', 'arg1', 'arg2', 'arg3']
您几乎肯定希望允许 analysis1.py
接受命令行参数作为对来自 init
.