如何将 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.

的值的覆盖