2014-12-05 198 views
1

我想創建一個運行PyPy的進程。我試過以下,它的工作原理:創建pypy進程

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

然而,當我刪除chdir爲:

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進程不改變工作目錄?

+0

您是否嘗試過爲'arg0'和'path'傳遞完整路徑?因爲大概它使用(sys.argv [0])的(RPython /編譯爲C的等價物)來查找它的庫路徑。 – abarnert 2014-12-05 20:08:56

回答

2

這可能是不正確的(在這種情況下,我會刪除它),但我敢肯定,所有你需要做的是:

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

換句話說,通過對全路徑arg0 as well as path

爲什麼?那麼,當PyPy啓動時,它必須使用(RPython /編譯爲C的等價物)sys.argv[0]來查找自定義stdlib的路徑。還有什麼可以使用的?當然這只是從char *argv[]參數中複製傳遞給解釋器的main函數。當你讓操作系統爲你啓動一個程序時,它會把完整的路徑放在那裏。但是,當你明確地將其設置爲execl時,它只會複製你給它的任何東西。

它實際上是一個複雜得多,這 - 它確實readlink(允許符號連接)和abspath(允許自己被相對路徑,如在第一個例子中運行)。但基本的想法是一樣的。

作爲一個方面說明,您可能想要考慮使用完全安裝的PyPy,而不是使用構建樹PyPy,在這種情況下,它的sys.prefix將被正確設置,因此它不需要這個。