1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

import sys 

 

 

class VendorImporter: 

""" 

A PEP 302 meta path importer for finding optionally-vendored 

or otherwise naturally-installed packages from root_name. 

""" 

 

def __init__(self, root_name, vendored_names=(), vendor_pkg=None): 

self.root_name = root_name 

self.vendored_names = set(vendored_names) 

self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') 

 

@property 

def search_path(self): 

""" 

Search first the vendor package then as a natural package. 

""" 

yield self.vendor_pkg + '.' 

yield '' 

 

def find_module(self, fullname, path=None): 

""" 

Return self when fullname starts with root_name and the 

target module is one vendored through this importer. 

""" 

root, base, target = fullname.partition(self.root_name + '.') 

if root: 

return 

if not any(map(target.startswith, self.vendored_names)): 

return 

return self 

 

def load_module(self, fullname): 

""" 

Iterate over the search path to locate and load fullname. 

""" 

root, base, target = fullname.partition(self.root_name + '.') 

for prefix in self.search_path: 

try: 

extant = prefix + target 

__import__(extant) 

mod = sys.modules[extant] 

sys.modules[fullname] = mod 

# mysterious hack: 

# Remove the reference to the extant package/module 

# on later Python versions to cause relative imports 

# in the vendor package to resolve the same modules 

# as those going through this importer. 

if prefix and sys.version_info > (3, 3): 

del sys.modules[extant] 

return mod 

except ImportError: 

pass 

else: 

raise ImportError( 

"The '{target}' package is required; " 

"normally this is bundled with this package so if you get " 

"this warning, consult the packager of your " 

"distribution.".format(**locals()) 

) 

 

def install(self): 

""" 

Install this importer into sys.meta_path if not already present. 

""" 

if self not in sys.meta_path: 

sys.meta_path.append(self) 

 

 

names = 'packaging', 'pyparsing', 'six', 'appdirs' 

VendorImporter(__name__, names).install()