2015-09-09 80 views
0

我从这个site中编辑了WebImporter类。Python Web导入器 - 加载子模块

import imp 
import sys 
import http.client 
from urllib.parse import urlparse 

def register_domain(name, url): 
    WebImporter.registered_domains[name] = url 

class WebImporter: 
    registered_domains = {} 

    def find_module(self, fullname, path=None): 
     print('FIND', fullname, path) 
     if fullname in self.registered_domains: 
      return self 
     if fullname.rsplit('.')[0] not in self.registered_domains: 
      return None 
     try: 
      r = self._do_request(fullname, method="HEAD") 
     except ValueError: 
      return None 
     else: 
      r.close() 
      if r.status == 200: 
       return self 
     return None 

    def load_module(self, fullname): 
     if fullname in sys.modules: 
      return sys.modules[fullname] 
     mod = imp.new_module(fullname) 
     mod.__loader__ = self 
     mod.__name__ = fullname 
     mod.__package__ = ['/'.join(fullname.split('.'))] 
     mod.__path__ = '/'.join(fullname.split('.')) 
     sys.modules[fullname] = mod 
     if fullname not in self.registered_domains: 
      url = self._get_host_and_path(fullname).geturl() 
      mod.__file__ = url 
      r = self._do_request(fullname) 
      code = r.read() 
      assert r.status == 200 
      exec(code, mod.__dict__) 
     else: 
      mod.__file__ = "[fake module %r]" % fullname 
      mod.__path__ = [] 
     return mod 

    def _do_request(self, fullname, method="GET"): 
     url = self._get_host_and_path(fullname) 
     c = http.client.HTTPConnection(url.netloc) 
     c.request(method, url.path) 
     return c.getresponse() 

    def _get_host_and_path(self, fullname): 
     tld, rest = fullname.rsplit('.', 1) 
     path = "/%s.py" % rest.replace('.', '/') 
     url = self.registered_domains[fullname.split('.')[0]] + path 
     url = urlparse(url) 
     return url 

sys.meta_path.append(WebImporter()) 

我有一个本地网络上我的Web服务器上的两个模块:

foo.py(在文件:):

class foo: 
    def __init__(self): 
     print('FOO') 

bar.py(文件位置:http://192.168.122.2:80/bar.py) :

from foo import foo 

class bar(foo): 
    def __init__(self): 
     foo.__init__(self) 
     print('BAR') 

当我运行:

import webimport 
webimport.register_domain('dev', 'http://192.168.122.2:80') 

from dev.foo import foo 

if __name__ == '__main__': 
    foo() 

它导入并运行代码

但是当我想导入并运行栏:

import webimport 
webimport.register_domain('dev', 'http://192.168.122.2:80') 

from dev.bar import bar 

if __name__ == '__main__': 
    bar() 

输出为:

FIND foo None 
Traceback (most recent call last): 
    File "test.py", line 4, in <module> 
    from dev.bar import bar 
    File "/home/user/tests/webimport/webimport.py", line 44, in load_module 
    exec(code, mod.__dict__) 
    File "<string>", line 1, in <module> 
ImportError: No module named 'foo' 

问题出在哪里?

回答

-1

您需要将foo模块的路径添加到PYTHONPATH中。如果你正在使用bash(Mac或GNU/Linux发行版上),将它添加到您的〜/ .bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path" 

EDITED

尝试bar.py改变

from foo import foo 

from dev.foo import foo 
+0

这两项文件是一个Web服务器,在我的本地机器上 – microo8