9

2 つの Python インタープリターがインストールされています。

[user@localhost ~]$ /usr/bin/python -V && /usr/local/bin/python -V
Python 2.4.3
Python 2.7.6

Sudo はPATH、実行するコマンドごとに次のように変更されます。

[user@localhost ~]$ env | grep PATH && sudo env | grep PATH
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/user/bin
PATH=/usr/bin:/bin

テスト スクリプトを実行します。

[user@localhost ~]$ cat what_python.py
#!/usr/bin/env python

import sys
print sys.executable
print sys.version
[user@localhost ~]$ sudo python what_python.py
/usr/bin/python
2.7.6 (default, Feb 27 2014, 17:05:07) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)]

で Python 2.4.3 へのパスを取得し、 でsys.executable報告されているバージョン 2.7.6を取得しますsys.version。明らかsys.executablesys.version一致していません。sudo がどのように PATH を変更するかを考慮すると、 の値を理解できますsys.executable。しかし、sys.versionバージョン 2.4.3 ではなく、バージョン 2.7.6 を報告usr/bin/pythonするのはなぜsys.executableですか?

これは私の質問Sudo changes PATHのフォローアップですが、同じバイナリを実行します

4

3 に答える 3

1

/usr/local/bin/python実行中の実行可能ファイルだと思います。バージョン文字列はほぼ確実に にコンパイルされるpythonため、間違っている可能性はほとんどありません。のドキュメントを見るsys.executable

sys.executable

これが理にかなっているシステムで、Python インタープリターの実行可能バイナリーの絶対パスを与える文字列。Python が実行可能ファイルへの実際のパスを取得できない場合、sys.executable は空の文字列または None になります。

これを取得できない可能性があるという事実は、設定された sudo を使用しpythonて独自のPATH検索を行っていることを示唆していPATHます (前の質問に対する私の回答によると、実行可能ファイルの検索に使用したものとは異なります)。

ここで確実にする唯一の方法は、Python の実装を掘り下げることですが、一般的には、バージョン文字列が信頼できるものである可能性が高いと言えます。一方、コマンドを実行するためにsudo使用しますexecve(少なくともmanページに従って)。実行可能ファイルのフル パスを指定する必要がありますexecve(一部のexecバリエーションは独自のPATH検索を行いますが、これは行いません)。したがって、python記入するのは非常に簡単ですsys.executable

インタプリタの実際の値を取得する方法があるかどうかはわかりません (argv[0]は常にスクリプトの名前または) ですが、これは興味深いものです。である場合、これは のバグです。pythonsys.argv[0]-c/usr/local/bin/pythonpython

secure_path最善の方法は、単に設定することだと思います/etc/sudoers。そうすれば、ある程度の一貫性が得られることを願っています.

アップデート

実際には、実行可能パスと配列execveの引数を取るため、必ずしも ではありません。ただし、次のようなスクリプトを作成することで、それを見つけることができます。argvargv[0]/usr/local/bin/python

import time
time.sleep(60)

次に、それを実行してps、完全な引数を取得します。

sudo python sleep.py &
ps -o args= -C python

また、どちらpythonが実行されているかを確認するには、次のようにします。

sudo ls -l /proc/PID/exe

プログラムの実行中。

于 2014-03-06T22:28:33.523 に答える
0

Python インタープリターを起動するたびに、シェルは /usr/bin/python に移動して実行します (次を試してください: python -c "import os; print(os.environ['_'])")。

それでは、ご覧のとおり、 ln -l | grep python/usr/bin/python は python インタープリター実行可能ファイルへのソフト リンクです。

私がしたことは:

  1. Python の最新バージョンをインストールします (Python の Web サイトにアクセスし、最新のコードをダウンロードして、configure && make && make install.
  2. この最後のバージョンの実行可能ファイルの場所を確認してください。
  3. /usr/bin/python ソフトリンク ## を消去します (root 権限 sudo が必要です)
  4. ln -s <location最後の python バージョンの実行可能ファイル> /usr/bin/python ## (かなりの確率で sudo が必要)
  5. コマンドラインから python を実行します。
  6. システムをインポート

sys.version ## 最後のものにする必要があります。

于 2015-01-14T19:26:23.633 に答える