如何在 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() 一样解决它。