プロセス内で、そのプロセスが実行されている場所をPythonで検出する方法はありますか? Spyder で壊れてgetpass.getpass()
いる関数を含むコードがいくつかありますが、コマンドラインと IDE の間を常に行き来するのは面倒です。次のようなコードを追加できれば便利です。
if not being run from Spyder:
use getpass
else:
use alternative
プロセス内で、そのプロセスが実行されている場所をPythonで検出する方法はありますか? Spyder で壊れてgetpass.getpass()
いる関数を含むコードがいくつかありますが、コマンドラインと IDE の間を常に行き来するのは面倒です。次のようなコードを追加できれば便利です。
if not being run from Spyder:
use getpass
else:
use alternative
これが私が最終的に使用したソリューションです。Markus's answerを読んだ後、Spyder が、 などの名前os.environ
で半ダースほどの環境変数を追加していることに気付きました。 . コードは単純で、Spyder の起動スクリプトとは独立して動作します (私が知る限り):SPYDER_ENCODING
SPYDER_SHELL_ID
'PYTHONSTARTUP'
if any('SPYDER' in name for name in os.environ)
# use alternative
else:
# use getpass
文字列は各環境変数名の先頭にあるため、 も使用できますがstr.startswith
、柔軟性が低く、少し遅くなります (興味がありました)。
>>> import timeit
>>> s = timeit.Timer("[name.startswith('SPYDER') for name in os.environ]", "import os")
>>> i = timeit.Timer("['SPYDER' in name for name in os.environ]", "import os")
>>> s.timeit()
16.18333065883474
>>> i.timeit()
6.156869294143846
インストール方法によっては、このsys.executable
方法が役立つ場合とそうでない場合があります。いくつかの WinPython インストールと別の Python 2.7 インストールがあるため、sys.executable.find('WinPy') == -1
Spyder が使用する実行可能ファイルのパスでフォルダー名を検出する条件を確認できました。使用しようとしたときにIDLEで表示される警告がgetpass
「うるさく」ないので、私の意見では、状態sys.executable.find('pythonw.exe') == -1
を確認して少し大きくしました。onlyを使用sys.executable
すると、そのメソッドは次のようになります。
if sys.executable.find('pythonw.exe') == sys.executable.find('WinPy') == -1:
# use getpass
else:
# use alternative
しかし、私はこれを他のマシンでも動作させたいので、別のユーザーが IDLE 実行可能ファイルの名前を変更するよりも、WinPython インストール フォルダー名を変更する可能性の方がはるかに高いため、最終的なコードを使用sys.executable
して IDLEos.environ
を検出し、Spyder を検出して、"どちらの場合でも警告を大きくし、後者ではコードが壊れないようにします。
if any('SPYDER' in name for name in os.environ) \
or 'pythonw.exe' in sys.executable:
password = raw_input('WARNING: PASSWORD WILL BE SHOWN ON SCREEN\n\n' * 3
+ 'Please enter your password: ')
else:
password = getpass.getpass("Please enter your password: ")
Spyder は、ネイティブ システム ターミナルで現在のエディタ スクリプトを実行するオプションを提供します。これにより、コマンド ラインから実行している場合と同じ動作が生成されます。これを設定するには、 を押して実行設定ダイアログを開きますF6
。次に、ラジオボタン「外部システム端末で実行」を選択します。を押して、通常どおりスクリプトを実行しますF5
。getpass
このアプローチで通常の方法で使用できるはずです。
Spyder での実行時に環境変数を追加し、コードでチェックすることができます。