2016-08-31 9 views
3

os.execveと仮想環境でいくつかの嫌悪感を試しています。現在のpythonプロセスを別のpythonサブプロセスに置き換えた場合、sys.executableが空である問題が発生しています。Python sys.executableが空です

以下の例は、(Pythonシェル内でこれを実行する)に何が起こっているかを示しています。

import os, sys 
print(sys.executable) # works this time 
os.execve("/usr/bin/python", [], {}) # drops me into a new python shell 
import sys # yes, again 
print(sys.executable) # is empty 

Pythonシェルで上記のコマンドを実行している私の完全な出力を:

lptp [ tmp ]: python 
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os, sys 
>>> print(sys.executable) # works this time 
/usr/bin/python 
>>> os.execve("/usr/bin/python", [], {}) # drops me into a new python shell 
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys # yes, again 
>>> print(sys.executable) # is empty 

>>> 

sys.executable空が原因で問題が発生しました。特に、sys.executableが空であるためplatform.libc_ver()が失敗します。

>>> import platform 
>>> platform.libc_ver() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/platform.py", line 163, in libc_ver 
    f = open(executable,'rb') 
IOError: [Errno 21] Is a directory: '/tmp' 

上記の例では、Pythonはsys.executableを決定するためにargv[0]といくつかの環境変数に依存しているos.execve(...)

+0

のenv 'os.execve( "は/ usr/binに/パイソン"、[]、はos.environ)として何を渡す場合*はos.environ *を' ? –

+0

hrmm、これはうまくいくのですが、上記の単純化した例でのみです。私の実際のコードでは違いはありません。私はすでに自分の現在の環境の修正版を渡しています。私は良い例で私の質問を更新します。 –

+0

sys.executableがNoneまたは空文字列の場合、それは見つからないので、空のdictをenvとして渡すことにはまったく関係しています。 –

答えて

2

を呼び出した後に実行されたことに注意してください。空のargvと環境を渡すと、Pythonはそのパスを決定する方法を知らない。少なくとも、あなたはargv[0]を提供する必要があります:

os.execve('/usr/bin/python', ['/usr/bin/python'], {}) 
関連する問題