1

我想创建一个运行 PyPy 的进程。我尝试了以下方法并且有效:

import os
os.chdir('<path-to-pypy-download>/bin/')
os.execl('pypy', 'pypy', '-c', 'print "Hi!"')

但是,当我删除chdiras 时:

import os
os.execl('<path-to-pypy-download>/bin/pypy', 'pypy', '-c', 'print "Hi!"')

我得到:

debug: WARNING: Library path not found, using compiled-in sys.path.
debug: WARNING: 'sys.prefix' will not be set.
debug: WARNING: Make sure the pypy binary is kept inside its tree of files.
debug: WARNING: It is ok to create a symlink to it from somewhere else.
debug: OperationError:
debug:  operror-type: ImportError
debug:  operror-value: No module named os

请问,有谁知道如何在不更改工作目录的情况下生成 PyPy 进程?

4

1 回答 1

2

这可能不正确(在这种情况下我会删除它),但我很确定您需要做的就是:

os.execl('<path-to-pypy-download>/bin/pypy', 
         '<path-to-pypy-download>/bin/pypy', '-c', 'print "Hi!"')

换句话说,将完整路径传递给arg0as 和path

为什么?好吧,当 PyPy 启动时,它必须使用(RPython/compiled-to-C 等价物)sys.argv[0]来查找自定义 stdlib 的路径。它还能用什么?当然,这只是从char *argv[]传递给解释器main函数的参数中复制而来的。当您让操作系统为您启动程序时,它会将完整路径放在那里。但是当你用 明确设置它时execl,它只会复制你给它的任何东西。

它实际上这更复杂一些 - 它执行 a readlink(允许符号链接)和 an abspath(允许自己通过相对路径运行 - 就像在你的第一个示例中一样)。但基本思想是一样的。

作为旁注,您可能需要考虑使用完全安装的 PyPy 而不是构建树用完的 PyPy,在这种情况下,sys.prefix它将正确设置,因此不需要它。

于 2014-12-05T20:10:17.063 回答