如何使用函数在python中导入变量?

如何使用函数在python中导入变量?,python,string,function,variables,Python,String,Function,Variables,我想写一个函数,它接受一个变量的名称、一个文件名和第三个字符串,并尝试从文件中导入给定的变量,如果不能这样做,它会将变量设置为第三个字符串。让我给你看看。这在my config.py中: variable = 'value' 这是我的功能(它不工作): 这就是我努力实现的目标: from config import variable print variable #prints 'value' 这个问题类似于“如何在python中使用变量名作为变量?”,但我找到的答案似乎并不适用于

我想写一个函数,它接受一个变量的名称、一个文件名和第三个字符串,并尝试从文件中导入给定的变量,如果不能这样做,它会将变量设置为第三个字符串。让我给你看看。这在my config.py中:

variable = 'value'
这是我的功能(它不工作):

这就是我努力实现的目标:

from config import variable

print variable     #prints 'value'

这个问题类似于“如何在python中使用变量名作为变量?”,但我找到的答案似乎并不适用于我。我不一定需要将它们存储在变量中,但我想不出更好的方法。我知道这是一个“在python中不应该做的事情”的完美例子,但我仍然需要这个。谢谢你的帮助

这应该给你一些线索:

>>> from importlib import import_module
>>> config = import_module('config')
>>> print( getattr(config, 'variable') )
value
有关详细信息,请参阅文档。

基本上,
getattr(x,'variable')
等同于
x.variable

这应该给你一些线索:

>>> from importlib import import_module
>>> config = import_module('config')
>>> print( getattr(config, 'variable') )
value
有关详细信息,请参阅文档。

基本上,
getattr(x,'variable')
相当于
x.variable

您要做的是从描述模块路径的字符串开始动态导入模块。您可以使用importlib包中的

import importlib

def importvar (var, fname, notfound) :
    try:
        return getattr(importlib.import_module(fname), var)
    except:
        return notfound

您要做的是从描述模块路径的字符串开始动态导入模块。您可以使用importlib包中的

import importlib

def importvar (var, fname, notfound) :
    try:
        return getattr(importlib.import_module(fname), var)
    except:
        return notfound

用于导入和返回导入变量的函数:

def importvar (var, fname, notfound):
    try:
        exec('from {f} import {v}'.format(f=fname, v=var))
        return locals().get(var, notfound)
    except:
        return notfound

用于导入和返回导入变量的函数:

def importvar (var, fname, notfound):
    try:
        exec('from {f} import {v}'.format(f=fname, v=var))
        return locals().get(var, notfound)
    except:
        return notfound

如果您只想从字符串进行简单的导入,那么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
内置可能就足够了。它将模块名作为字符串并返回。如果还需要以编程方式从中获取属性,请使用内置的
getattr
,它将属性名称作为字符串

但是,如果您试图导入一个包子模块,
importlib.import\u module
更容易——您可以导入一个带有点的名称,然后直接获取模块。这只是为您调用
\uuuuuuuuuuuuuuuuuuuuuuu
。比较
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu(“logging.config”).config
导入模块(“logging.config”)

如果您试图导入一个不在Python路径上的任意文件,那么它会更加复杂。Python文档对此进行了说明

import importlib.util

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
\uuuuuuuuuuuuuuuuuuuuu导入
不同,这不会将模块添加到缓存中,因为它没有规范的导入名称。但是,如果您想以后正常导入它,您可以自己添加它(使用您想要的任何名称),例如

import sys
sys.modules["foo_module"] = module
运行此命令后,它允许您使用简单的

import foo_module

如果您只想从字符串进行简单的导入,那么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
内置可能就足够了。它将模块名作为字符串并返回。如果还需要以编程方式从中获取属性,请使用内置的
getattr
,它将属性名称作为字符串

但是,如果您试图导入一个包子模块,
importlib.import\u module
更容易——您可以导入一个带有点的名称,然后直接获取模块。这只是为您调用
\uuuuuuuuuuuuuuuuuuuuuuu
。比较
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu(“logging.config”).config
导入模块(“logging.config”)

如果您试图导入一个不在Python路径上的任意文件,那么它会更加复杂。Python文档对此进行了说明

import importlib.util

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
\uuuuuuuuuuuuuuuuuuuuu导入
不同,这不会将模块添加到缓存中,因为它没有规范的导入名称。但是,如果您想以后正常导入它,您可以自己添加它(使用您想要的任何名称),例如

import sys
sys.modules["foo_module"] = module
运行此命令后,它允许您使用简单的

import foo_module

您想做的是使用import_模块,但实际上您应该解释为什么您认为您需要它。@DanielRoseman我需要在一个项目中从多个不同的文件中导入多个变量,我不想键入这个try。。。其他的很多时候,你想做的是使用import_模块,但实际上你应该解释为什么你认为你需要它。@DanielRoseman我需要在一个项目中从多个不同的文件中导入许多变量,我不想键入这个try。。。其他的很多时候,这是不够的,因为OP也想动态地传递模块(
config
,在这种情况下)。这不能处理
variable
config
的子模块的情况。这是不够的,因为OP想传递模块(
config
,在这种情况下)动态的。这不能处理
变量
配置
的子模块的情况。回答得很好!正是我要找的!回答得好!正是我要找的!return locals()variable@TheAdam122不是真的
locals().get(value)
=
locals().get(value,None)
@ppperry我知道,但我认为少键入总是更好:)返回局部变量().get(var)就足够了,您不需要提供“else”,因为当它无法执行导入variable@TheAdam122不是真的
locals().get(value)
==
locals().get(value,None)
@ppperry我知道,但我认为打字越少越好:)