13

os.execve仮想環境でいくつかの悪ふざけを試しています。sys.executable現在のpythonプロセスを別のpythonサブプロセスに置き換えると、空になるという問題が発生します。

以下の例は、何が起こっているかを示しています (これを 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空であることは私に問題を引き起こしています。最も顕著なのは空であるplatform.libc_ver()ために失敗することsys.executableです:

>>> 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'

上記の例は、呼び出し後に実行されたことに注意してくださいos.execve(...)

4

1 に答える 1

10

argv[0]Python は、いくつかの環境変数に依存してsys.executable. 空の argv と環境を渡すと、Python はそのパスを決定する方法を知りません。少なくとも、以下を提供する必要がありますargv[0]

os.execve('/usr/bin/python', ['/usr/bin/python'], {})
于 2016-08-31T16:40:40.253 に答える