Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中导入变量包,就像在PHP中使用变量($$)一样?_Python_Variables_Variable Variables - Fatal编程技术网

如何在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。