如何在 Python 函数中创建全局(模块)对象?
How should a global (module) object be created in a Python function?
我正在尝试从 URL 向 "import" 的 Python 模块编写一个函数(作为实验——当然,这种方法存在安全问题).这样做时,我试图在函数中创建模块对象,然后使用远程模块的下载代码对其进行修改。我认为这是可行的,但我很难使这个模块在函数之外可用。
如何使模块 I "import" 在 "importing" 函数之外可用?
import sys
import urllib
import imp
def smuggle(URL = None, As = None):
exec("global " + As)
moduleLocalName = As
moduleString = urllib.urlopen(URL).read()
if moduleLocalName is None:
exec moduleString in globals()
else:
exec(moduleLocalName + " = imp.new_module(\"" + moduleLocalName + "\")")
exec moduleString in globals()[moduleLocalName].__dict__
smuggle(URL = "https://cdn.rawgit.com/wdbm/shijian/master/shijian.py", As = "shijianTest")
alpha = shijianTest.Clock(name = "alpha")
alpha.printout()
还有一个要考虑的事情:
也许,只是 return 一个模块并在需要的地方使用它?
# hello.py
def world():
print 'hello world!'
# smuggle.py
def smuggle(url, name):
code = urllib.urlopen(url).read()
module = imp.new_module(name)
exec code in module.__dict__
return module
hello = smuggle("http://127.0.0.1:1234/hello.py", "hello")
hello.world()
# prints out "hello world!"
您还可以创建一个走私模块的全局字典,并将导入的模块放在那里,然后像 smuggled['hello'].world()
一样解决它。
我正在尝试从 URL 向 "import" 的 Python 模块编写一个函数(作为实验——当然,这种方法存在安全问题).这样做时,我试图在函数中创建模块对象,然后使用远程模块的下载代码对其进行修改。我认为这是可行的,但我很难使这个模块在函数之外可用。
如何使模块 I "import" 在 "importing" 函数之外可用?
import sys
import urllib
import imp
def smuggle(URL = None, As = None):
exec("global " + As)
moduleLocalName = As
moduleString = urllib.urlopen(URL).read()
if moduleLocalName is None:
exec moduleString in globals()
else:
exec(moduleLocalName + " = imp.new_module(\"" + moduleLocalName + "\")")
exec moduleString in globals()[moduleLocalName].__dict__
smuggle(URL = "https://cdn.rawgit.com/wdbm/shijian/master/shijian.py", As = "shijianTest")
alpha = shijianTest.Clock(name = "alpha")
alpha.printout()
还有一个要考虑的事情:
也许,只是 return 一个模块并在需要的地方使用它?
# hello.py
def world():
print 'hello world!'
# smuggle.py
def smuggle(url, name):
code = urllib.urlopen(url).read()
module = imp.new_module(name)
exec code in module.__dict__
return module
hello = smuggle("http://127.0.0.1:1234/hello.py", "hello")
hello.world()
# prints out "hello world!"
您还可以创建一个走私模块的全局字典,并将导入的模块放在那里,然后像 smuggled['hello'].world()
一样解决它。