如何在Python中导入变量包,就像在PHP中使用变量($$)一样?
我想根据用户选择的值导入一些包 默认值为如何在Python中导入变量包,就像在PHP中使用变量($$)一样?,python,variables,variable-variables,Python,Variables,Variable Variables,我想根据用户选择的值导入一些包 默认值为file1.py: 从文件导入文件1 如果用户选择file2,则应为: 从文件导入文件2 在PHP中,我可以使用: $file_name='file1'; 包括($$file\u name); $file_name='file2'; 包括($$file\u name); 如何在Python中执行此操作?As 总之,以下是这些语句和函数的工作原理: import X导入模块X,并创建对该模块的引用 在当前命名空间中。或者换句话说,在你运行完这个之后
file1.py
:
从文件导入文件1
如果用户选择file2
,则应为:
从文件导入文件2
在PHP中,我可以使用:
$file_name='file1';
包括($$file\u name);
$file_name='file2';
包括($$file\u name);
如何在Python中执行此操作?As
总之,以下是这些语句和函数的工作原理:
import X
导入模块X,并创建对该模块的引用
在当前命名空间中。或者换句话说,在你运行完这个之后
语句,您可以使用X.name
引用模块X中定义的内容
从X导入*
导入模块X,并在
由该模块定义的所有公共对象的当前命名空间(该
就是说,所有没有以“389;”开头的名字的东西。或者
换句话说,在运行此语句之后,您只需使用
普通名称是指模块X中定义的东西,但X本身不是
已定义,因此X.name
不起作用。如果已经定义了名称,那么
被新版本所取代。如果X中的名称改为点
对于其他对象,您的模块不会注意到
从X导入a、b、c
导入模块X,并在中创建引用
指定对象的当前命名空间。或者换句话说,你可以
现在在程序中使用a
和b
和c
最后,X=\uuuuuuuuuuuuuuuuuuuuuu('X')
的工作原理类似于import X
,但不同之处在于
1)以字符串形式传递模块名称,2)显式分配
将其转换为当前命名空间中的变量。
顺便说一下,这是你感兴趣的最后一种方法
简单地写(例如):
作为
总之,以下是这些语句和函数的工作原理:
import X
导入模块X,并创建对该模块的引用
在当前命名空间中。或者换句话说,在你运行完这个之后
语句,您可以使用X.name
引用模块X中定义的内容
从X导入*
导入模块X,并在
由该模块定义的所有公共对象的当前命名空间(该
就是说,所有没有以“389;”开头的名字的东西。或者
换句话说,在运行此语句之后,您只需使用
普通名称是指模块X中定义的东西,但X本身不是
已定义,因此X.name
不起作用。如果已经定义了名称,那么
被新版本所取代。如果X中的名称改为点
对于其他对象,您的模块不会注意到
从X导入a、b、c
导入模块X,并在中创建引用
指定对象的当前命名空间。或者换句话说,你可以
现在在程序中使用a
和b
和c
最后,X=\uuuuuuuuuuuuuuuuuuuuuu('X')
的工作原理类似于import X
,但不同之处在于
1)以字符串形式传递模块名称,2)显式分配
将其转换为当前命名空间中的变量。
顺便说一下,这是你感兴趣的最后一种方法
简单地写(例如):
Python没有与PHP的“变量”直接等价的特性。要获取“变量”的值(或任何其他表达式的值),可以使用
eval
函数
foo = "Hello World"
print eval("foo")
但是,这不能用于import
语句
可以使用函数使用变量进行导入
package = "os"
name = "path"
imported = getattr(__import__(package, fromlist=[name]), name)
相当于
from os import path as imported
Python没有与PHP的“变量”直接等价的特性。要获取“变量”的值(或任何其他表达式的值),可以使用
eval
函数
foo = "Hello World"
print eval("foo")
但是,这不能用于import
语句
可以使用函数使用变量进行导入
package = "os"
name = "path"
imported = getattr(__import__(package, fromlist=[name]), name)
相当于
from os import path as imported
让用户选择要导入的内容可能是一个非常糟糕的主意。软件包可以在导入时执行代码,因此您可以有效地允许用户在您的系统上任意执行代码!做这样的事情要安全得多
if user_input == 'file1.py':
from files import file1 as file
elif user_input == 'file2.py':
from files import file2 as file
else:
file = None
print "Sorry, you can't import that file"
让用户选择要导入的内容可能是一个非常糟糕的主意。软件包可以在导入时执行代码,因此您可以有效地允许用户在您的系统上任意执行代码!做这样的事情要安全得多
if user_input == 'file1.py':
from files import file1 as file
elif user_input == 'file2.py':
from files import file2 as file
else:
file = None
print "Sorry, you can't import that file"
旧线程,但我需要答案,所以其他人仍然可能 在Python 2.7+中有一种更简洁的方法来实现这一点:
import importlib
my_module = importlib.import_module("package.path.%s" % module_name)
旧线程,但我需要答案,所以其他人仍然可能 在Python 2.7+中有一种更简洁的方法来实现这一点:
import importlib
my_module = importlib.import_module("package.path.%s" % module_name)
根据mattjbray的回答:
from importlib import import_module
# lookup in a set is in constant time
safe_names = {"file1.py", "file2.py", "file3.py", ...}
user_input = ...
if user_input in safe_names:
file = import_module(user_input)
else:
print("Nope, not doing this.")
保存几行代码,并允许您以编程方式设置
安全名称
,或加载多个模块并将其分配给dict,例如。基于mattjbray
的答案:
from importlib import import_module
# lookup in a set is in constant time
safe_names = {"file1.py", "file2.py", "file3.py", ...}
user_input = ...
if user_input in safe_names:
file = import_module(user_input)
else:
print("Nope, not doing this.")
保存几行代码,并允许您以编程方式设置
safe\u名称
,或者加载多个模块并将它们分配给一个dict,例如。不要这样做!使用输入通常是不可信的,基于它评估代码是一个坏主意。谢谢,我现在使用默认设置导入。不要这样做!使用输入通常是不可信的,基于它对代码进行盲目评估是个坏主意。谢谢,我现在使用默认设置导入。提示:您需要一个package.path.\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。