Python 动态导入文件

Python 动态导入文件,python,file,import,reload,Python,File,Import,Reload,我正在写一个小脚本,将一个程序的输出文件转换成另一个程序的输入文件 要创建这些输入文件,需要一些额外的用户输入。 我想将此用户输入保存在一个单独的文件中。运行脚本时,用户可以通过sys.argv将其配置文件指定为字符串 配置文件仅包含变量,不包含函数: N_a = 2 N_b = 5 N_c = ... . . . 现在,在字符串给定的文件中导入变量的最佳实践是什么? 最重要的是:每次执行脚本时都应该重新加载此文件,以防用户在两次运行之间更改了某些内容。是否可以对每个任意文件执行此操作,

我正在写一个小脚本,将一个程序的输出文件转换成另一个程序的输入文件

要创建这些输入文件,需要一些额外的用户输入。 我想将此用户输入保存在一个单独的文件中。运行脚本时,用户可以通过
sys.argv
将其配置文件指定为字符串

配置文件仅包含变量,不包含函数:

N_a = 2
N_b = 5
N_c = ...
 .
 .
 .
现在,在字符串给定的文件中导入变量的最佳实践是什么?
最重要的是:每次执行脚本时都应该重新加载此文件,以防用户在两次运行之间更改了某些内容。是否可以对每个任意文件执行此操作,或者它是否需要是
.py
文件?

最安全的方法是手动解析文件

但是你当然可以用

execfile("/path/to/a.py")

尽管。。是的,它的结尾可以是您想要的任何内容。conf、.blah、

最安全的方法是手动解析文件

但是你当然可以用

execfile("/path/to/a.py")

尽管。。是的,它的结尾可以是你想要的任何东西。conf、.blah、

要回答你的问题,你可以使用
eval
获取任意字符串并将其作为python代码计算。或者,您可以使用
exec
将任意字符串作为python表达式执行

一般来说,不建议这样做,因为这会使您的程序易受攻击-假设有人知道您的代码正在使用此
eval
exec
函数,恶意用户可能会将一些python代码插入其配置文件中,并对您的系统造成实际损害

相反,我认为您要做的是解析用户的配置文件并适当地设置变量。例如:

# file configParser.py
userfile = 'users_file.txt'
values = {}
with open(userfile, 'r') as infile:
    for line in userfile:
        name, value = line.strip().split('=')
        values[name] = value
然后,您可以稍后使用
dict访问这些值:

values['N_a'] # holds '2'
values['N_b'] # holds '5'
# etc...
请注意,存储的值是字符串。您可以根据需要将它们转换为
int
s或
float
s或w/e


需要记住的是,这种方法假设ever行由
变量\u name=value
模式组成。如果用户偏离此模式或恰好提供了无效值,则解析器可能会崩溃。有一些模块,如
configparser
,专门用于指定用户可用于向程序提供数据的配置文件格式。

要回答您的问题,可以使用
eval
获取任意字符串并将其作为python代码进行计算。或者,您可以使用
exec
将任意字符串作为python表达式执行

一般来说,不建议这样做,因为这会使您的程序易受攻击-假设有人知道您的代码正在使用此
eval
exec
函数,恶意用户可能会将一些python代码插入其配置文件中,并对您的系统造成实际损害

相反,我认为您要做的是解析用户的配置文件并适当地设置变量。例如:

# file configParser.py
userfile = 'users_file.txt'
values = {}
with open(userfile, 'r') as infile:
    for line in userfile:
        name, value = line.strip().split('=')
        values[name] = value
然后,您可以稍后使用
dict访问这些值:

values['N_a'] # holds '2'
values['N_b'] # holds '5'
# etc...
请注意,存储的值是字符串。您可以根据需要将它们转换为
int
s或
float
s或w/e


需要记住的是,这种方法假设ever行由
变量\u name=value
模式组成。如果用户偏离此模式或恰好提供了无效值,则解析器可能会崩溃。有一些模块,如
configparser
,专门用于指定用户可用于向程序提供数据的配置文件格式。

您是否考虑过使用
configparser
模块?您可以使用模块中描述的语法创建配置文件并使用它来解析它。您是否考虑过使用
configparser
模块?您可以使用模块中描述的语法创建一个配置文件,并使用它来解析它。伟大的答案:)++到configparser建议:)++到configparser建议:)++到configparser建议