Author: Antonio Cuni <anto.c...@gmail.com> Branch: app_main-refactor Changeset: r55508:71e19f8cab3d Date: 2012-06-08 15:21 +0200 http://bitbucket.org/pypy/pypy/changeset/71e19f8cab3d/
Log: move the logic to compute the stdlib path to its own file diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py --- a/pypy/module/sys/__init__.py +++ b/pypy/module/sys/__init__.py @@ -44,8 +44,8 @@ 'warnoptions' : 'state.get(space).w_warnoptions', 'builtin_module_names' : 'space.w_None', 'pypy_getudir' : 'state.pypy_getudir', # not translated - 'pypy_initial_path' : 'state.pypy_initial_path', - 'pypy_find_executable' : 'state.pypy_find_executable', + 'pypy_initial_path' : 'initpath.pypy_initial_path', + 'pypy_find_executable' : 'initpath.pypy_find_executable', '_getframe' : 'vm._getframe', '_current_frames' : 'currentframes._current_frames', diff --git a/pypy/module/sys/initpath.py b/pypy/module/sys/initpath.py new file mode 100644 --- /dev/null +++ b/pypy/module/sys/initpath.py @@ -0,0 +1,99 @@ +""" +Logic to find sys.executable and the initial sys.path containing the stdlib +""" + +import sys +import os +import stat +import errno +from pypy.rlib import rpath +from pypy.rlib.objectmodel import we_are_translated +from pypy.interpreter.gateway import unwrap_spec + +platform = sys.platform +IS_WINDOWS = sys.platform == 'win32' + +def find_executable(executable): + if we_are_translated() and IS_WINDOWS and not executable.lower().endswith('.exe'): + executable += '.exe' + if os.sep in executable or (IS_WINDOWS and ':' in executable): + pass # the path is already more than just an executable name + else: + path = os.environ.get('PATH') + if path: + for dir in path.split(os.pathsep): + fn = os.path.join(dir, executable) + if os.path.isfile(fn): + executable = fn + break + executable = rpath.rabspath(executable) + # + # 'sys.executable' should not end up being an non-existing file; + # just use '' in this case. (CPython issue #7774) + if not os.path.isfile(executable): + executable = '' + return executable + + + +def checkdir(path): + st = os.stat(path) + if not stat.S_ISDIR(st[0]): + raise OSError(errno.ENOTDIR, path) + + + +def compute_stdlib_path(state, prefix): + from pypy.module.sys.version import CPYTHON_VERSION + dirname = '%d.%d' % (CPYTHON_VERSION[0], + CPYTHON_VERSION[1]) + lib_python = os.path.join(prefix, 'lib-python') + python_std_lib = os.path.join(lib_python, dirname) + checkdir(python_std_lib) + + lib_pypy = os.path.join(prefix, 'lib_pypy') + checkdir(lib_pypy) + + importlist = [] + # + if state is not None: # 'None' for testing only + lib_extensions = os.path.join(lib_pypy, '__extensions__') + state.w_lib_extensions = state.space.wrap(lib_extensions) + importlist.append(lib_extensions) + # + importlist.append(lib_pypy) + importlist.append(python_std_lib) + # + lib_tk = os.path.join(python_std_lib, 'lib-tk') + importlist.append(lib_tk) + # + # List here the extra platform-specific paths. + if platform != 'win32': + importlist.append(os.path.join(python_std_lib, 'plat-'+platform)) + if platform == 'darwin': + platmac = os.path.join(python_std_lib, 'plat-mac') + importlist.append(platmac) + importlist.append(os.path.join(platmac, 'lib-scriptpackages')) + # + return importlist + + +@unwrap_spec(executable='str0') +def pypy_find_executable(space, executable): + return space.wrap(find_executable(executable)) + + +@unwrap_spec(srcdir='str0') +def pypy_initial_path(space, srcdir): + try: + path = compute_stdlib_path(get(space), srcdir) + except OSError: + return space.w_None + else: + space.setitem(space.sys.w_dict, space.wrap('prefix'), + space.wrap(srcdir)) + space.setitem(space.sys.w_dict, space.wrap('exec_prefix'), + space.wrap(srcdir)) + return space.newlist([space.wrap(p) for p in path]) + + diff --git a/pypy/module/sys/state.py b/pypy/module/sys/state.py --- a/pypy/module/sys/state.py +++ b/pypy/module/sys/state.py @@ -1,12 +1,9 @@ """ Implementation of interpreter-level 'sys' routines. """ +import os import pypy -from pypy.rlib.objectmodel import we_are_translated -from pypy.interpreter.error import OperationError -from pypy.interpreter.gateway import unwrap_spec - -import sys, os, stat, errno +from pypy.module.sys.initpath import compute_stdlib_path # ____________________________________________________________ # @@ -25,63 +22,9 @@ # Initialize the default path pypydir = os.path.dirname(os.path.abspath(pypy.__file__)) srcdir = os.path.dirname(pypydir) - path = getinitialpath(self, srcdir) + path = compute_stdlib_path(self, srcdir) self.w_path = space.newlist([space.wrap(p) for p in path]) -def checkdir(path): - st = os.stat(path) - if not stat.S_ISDIR(st[0]): - raise OSError(errno.ENOTDIR, path) - - -platform = sys.platform - -def getinitialpath(state, prefix): - from pypy.module.sys.version import CPYTHON_VERSION - dirname = '%d.%d' % (CPYTHON_VERSION[0], - CPYTHON_VERSION[1]) - lib_python = os.path.join(prefix, 'lib-python') - python_std_lib = os.path.join(lib_python, dirname) - checkdir(python_std_lib) - - lib_pypy = os.path.join(prefix, 'lib_pypy') - checkdir(lib_pypy) - - importlist = [] - # - if state is not None: # 'None' for testing only - lib_extensions = os.path.join(lib_pypy, '__extensions__') - state.w_lib_extensions = state.space.wrap(lib_extensions) - importlist.append(lib_extensions) - # - importlist.append(lib_pypy) - importlist.append(python_std_lib) - # - lib_tk = os.path.join(python_std_lib, 'lib-tk') - importlist.append(lib_tk) - # - # List here the extra platform-specific paths. - if platform != 'win32': - importlist.append(os.path.join(python_std_lib, 'plat-'+platform)) - if platform == 'darwin': - platmac = os.path.join(python_std_lib, 'plat-mac') - importlist.append(platmac) - importlist.append(os.path.join(platmac, 'lib-scriptpackages')) - # - return importlist - -@unwrap_spec(srcdir='str0') -def pypy_initial_path(space, srcdir): - try: - path = getinitialpath(get(space), srcdir) - except OSError: - return space.w_None - else: - space.setitem(space.sys.w_dict, space.wrap('prefix'), - space.wrap(srcdir)) - space.setitem(space.sys.w_dict, space.wrap('exec_prefix'), - space.wrap(srcdir)) - return space.newlist([space.wrap(p) for p in path]) def get(space): return space.fromcache(State) @@ -117,31 +60,3 @@ from pypy.tool.udir import udir return space.wrap(str(udir)) - -IS_WINDOWS = 'nt' in sys.builtin_module_names - -def find_executable(executable): - if we_are_translated() and IS_WINDOWS and not executable.lower().endswith('.exe'): - executable += '.exe' - if os.sep in executable or (IS_WINDOWS and ':' in executable): - pass # the path is already more than just an executable name - else: - path = os.environ.get('PATH') - if path: - for dir in path.split(os.pathsep): - fn = os.path.join(dir, executable) - if os.path.isfile(fn): - executable = fn - break - executable = os.path.abspath(executable) - # - # 'sys.executable' should not end up being an non-existing file; - # just use '' in this case. (CPython issue #7774) - if not os.path.isfile(executable): - executable = '' - return executable - -@unwrap_spec(executable='str0') -def pypy_find_executable(space, executable): - executable = find_executable(executable) - return space.wrap() diff --git a/pypy/module/sys/test/test_initialpath.py b/pypy/module/sys/test/test_initpath.py rename from pypy/module/sys/test/test_initialpath.py rename to pypy/module/sys/test/test_initpath.py --- a/pypy/module/sys/test/test_initialpath.py +++ b/pypy/module/sys/test/test_initpath.py @@ -1,6 +1,6 @@ import py import os.path -from pypy.module.sys.state import getinitialpath, find_executable +from pypy.module.sys.initpath import compute_stdlib_path, find_executable from pypy.module.sys.version import PYPY_VERSION, CPYTHON_VERSION def build_hierarchy(prefix): @@ -12,19 +12,19 @@ def test_stdlib_in_prefix(tmpdir): dirs = build_hierarchy(tmpdir) - path = getinitialpath(None, str(tmpdir)) + path = compute_stdlib_path(None, str(tmpdir)) # we get at least 'dirs', and maybe more (e.g. plat-linux2) assert path[:len(dirs)] == map(str, dirs) def test_include_libtk(tmpdir): lib_pypy, lib_python = build_hierarchy(tmpdir) lib_tk = lib_python.join('lib-tk') - path = getinitialpath(None, str(tmpdir)) + path = compute_stdlib_path(None, str(tmpdir)) assert lib_tk in path def test_find_executable(tmpdir, monkeypatch): - from pypy.module.sys import state + from pypy.module.sys import initpath # /tmp/a/pypy # /tmp/b/pypy # /tmp/c @@ -60,8 +60,8 @@ c.join('pypy').ensure(dir=True) assert find_executable('pypy') == a.join('pypy') # - monkeypatch.setattr(state, 'we_are_translated', lambda: True) - monkeypatch.setattr(state, 'IS_WINDOWS', True) + monkeypatch.setattr(initpath, 'we_are_translated', lambda: True) + monkeypatch.setattr(initpath, 'IS_WINDOWS', True) monkeypatch.setenv('PATH', str(a)) a.join('pypy.exe').ensure(file=True) assert find_executable('pypy') == a.join('pypy.exe') diff --git a/pypy/rlib/rpath.py b/pypy/rlib/rpath.py --- a/pypy/rlib/rpath.py +++ b/pypy/rlib/rpath.py @@ -3,7 +3,6 @@ """ import os.path -from os import sep, pathsep from pypy.rlib import rposix if os.name == 'posix': _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit