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'
問題出在哪裏?
這兩項文件是一個Web服務器,在我的本地機器上 – microo8