2015-09-09 79 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