0

私はWindowsを使用しています。setup.py次のシナリオを可能にするPython 2.x スクリプト (と呼びましょう) を作成しようとしています。

  1. ユーザーが cmd を実行してコンソール ウィンドウを開く
  2. そのコンソールウィンドウで、ユーザーは実行しますsetup.py
  3. ユーザーは同じコンソール ウィンドウで自分自身を見つけますが、そこで実行されている cmd の環境 (env. 変数) が変更されています。setup.py

setup.pyFOOvalueで新しい環境変数を追加し、foo何かを前に付けて、環境を変更しますPATH

Linux ではos.exec*e、Python プロセスを環境が構成されたシェルに置き換えるだけです。

Windowsで同じアプローチを試みましたが(のようにos.exec*e(os.environ['ComSpec']))、うまくいきません。新しく実行されたcmdの環境は次のようにめちゃくちゃです:

  • 実行するとsetリストFOOに表示されず、効果が表示されませんPATHset 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 の実行を終了できるようにするフラグの組み合わせはありますか? または、ヘルプからアクセスCreateProcessctypesますか?

必要に応じて、新しいコンソール ウィンドウを起動して古いコンソール ウィンドウを閉じることで解決できますが、新しく作成したコンソール ウィンドウが閉じるのを待って、古いコンソール ウィンドウをフリーズしたままにしておく余裕はありません。

4

1 に答える 1

2

バッチ ファイルは呼び出しプロセスで実行され、その環境を変更できるため、スクリプトに加えて Windows バッチ ファイルを使用できる場合は、はるかに簡単な解決策があります。

setup.bat次のようなfileを指定すると...

@echo off
for /f "tokens=*" %%a in ('python setup.py') do %%a

setup.py...そして、このようなファイル...

import os
print 'set FOO=foo'
print 'set PATH=%s;%s' % ('C:\\my_path_dir', os.environ['PATH'])

...そしてpython.exePATHにあると仮定するとsetup.bat、コマンドラインから呼び出すと、呼び出しプロセスに環境変数が設定さsetup.pyれますが、必要なコマンドを出力する限り、スクリプトを好きなだけ複雑にすることができますstdout に実行します。

コメントに基づいて更新

setup.py複数の操作モードがある場合は、その汎用ラッパーを作成できますsetup.bat。代わりsetup.batにこのように見えるとします...

@echo off
if "%1" == "setenv" (
    for /f "tokens=*" %%a in ('python setup.py %1') do %%a
) else (
    python setup.py %*
)

...そしてsetup.py、このように見えます...

import sys
import os

if len(sys.argv) > 1 and sys.argv[1] == 'setenv':
    print 'set FOO=foo'
    print 'set PATH=%s;%s' % ('C:\\my_path_dir', os.environ['PATH'])
else:
    print "I'm gonna do something else with argv=%r" % sys.argv

……それでいいんじゃない?

于 2013-04-11T11:32:17.247 に答える