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(...)
のenv 'os.execve( "は/ usr/binに/パイソン"、[]、はos.environ)として何を渡す場合*はos.environ *を' ? –
hrmm、これはうまくいくのですが、上記の単純化した例でのみです。私の実際のコードでは違いはありません。私はすでに自分の現在の環境の修正版を渡しています。私は良い例で私の質問を更新します。 –
sys.executableがNoneまたは空文字列の場合、それは見つからないので、空のdictをenvとして渡すことにはまったく関係しています。 –