私はWindowsを使用しています。setup.py次のシナリオを可能にするPython 2.x スクリプト (と呼びましょう) を作成しようとしています。
- ユーザーが cmd を実行してコンソール ウィンドウを開く
- そのコンソールウィンドウで、ユーザーは実行します
setup.py - ユーザーは同じコンソール ウィンドウで自分自身を見つけますが、そこで実行されている cmd の環境 (env. 変数) が変更されています。
setup.py
setup.pyFOOvalueで新しい環境変数を追加し、foo何かを前に付けて、環境を変更しますPATH。
Linux ではos.exec*e、Python プロセスを環境が構成されたシェルに置き換えるだけです。
Windowsで同じアプローチを試みましたが(のようにos.exec*e(os.environ['ComSpec']))、うまくいきません。新しく実行されたcmdの環境は次のようにめちゃくちゃです:
実行すると
setリストFOOに表示されず、効果が表示されませんPATH。set FOOただし、実行すると、が表示FOO=fooされ、echo %FOO%エコーが発生しfooます。変更された変数を実行
set PATHまたは表示します。値を変更せずに実行または表示します(環境変数は通常、Windows では大文字と小文字が区別されません)。echo %PATH%PATHset pathecho %path%と入力
exitすると、 を押すまで、コンソールは入力を受け付けない状態でハングしたままになりCtrl+Cます。cmdその後、元の に戻るようsetup.pyです。
明らかに、os.exec*eWindows のこのシナリオでは機能しません。私が望むものを達成する別の方法はありますか? subprocess.Popen()呼び出し元の Python プロセスを終了し、理想的には同じコンソールで、呼び出された cmd の実行を終了できるようにするフラグの組み合わせはありますか? または、ヘルプからアクセスCreateProcessしctypesますか?
必要に応じて、新しいコンソール ウィンドウを起動して古いコンソール ウィンドウを閉じることで解決できますが、新しく作成したコンソール ウィンドウが閉じるのを待って、古いコンソール ウィンドウをフリーズしたままにしておく余裕はありません。