2009-07-28 12 views
7

WindowsでのUnix評価に相当する

acシェルスクリプト(拡張子csh)から、スクリプトからの出力がシェル環境に影響するように、Pythonスクリプトを 'eval'メソッド内で実行しています。次のようになります。

eval `python -c "import sys; run_my_code_here(); "` 

Windowsの組み込みのCMDシェルを使用して、Windowsでevalステートメントを実行する方法が不思議でした。私は、Windowsスクリプト内でPythonスクリプトを実行し、Pythonスクリプトが出力するものをスクリプトに実行させたいと考えています。

**アップデート:CMDシェルから実行することを指定しました。

+0

使用しているシェルを特定してください。 CMDは私の最高の推測ですが、多分あなたはPowerShellまたはCSHのWindowsポートを意味します。 –

答えて

4

[私の知っていること]それはcmd.exeでいた場合は、一時ファイルを使用することが唯一のオプションです:CMDで

python -c "print(\"Hi\")" > temp.cmd 
call temp.cmd 
del temp.cmd 
3

(詳細はあなたの質問から欠落しているいくつかの推測を作る)

、バッチスクリプトが環境を変更するとき、デフォルトの動作は、それを実行しているCMDプロセスの環境を変更することです。

別のバッチスクリプトを呼び出すバッチスクリプトがある場合は、3つの方法があります。

  1. 直接バッチファイルを実行します。

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    それが呼び出すバッチスクリプトに戻りませんので、通常、あなたが、これを望んでいません。これはよりgotoのようなものです。 CMDプロセスはあるスクリプトから別のスクリプトに切り替えるだけです。

  2. callで実行します。

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    これは別のものを呼び出すための1つのバッチファイルのための最も一般的な方法です。 q.batが終了すると、制御は呼び出し元に戻ります。これは同じCMDプロセスなので、環境への変更はまだそこにあります。

    注:q.batEXITステートメントを使用すると、呼び出し元のスクリプトに制御を戻すことなく、CMDプロセスが終了することがあります。


    注2:がEXIT /Bを使用する場合、CMDプロセスは終了しません。これはERRORLEVELを設定するのに便利です。新しいCMDプロセスで

  3. 実行します。q.bat実行が新しいCMDプロセスをINS

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    ので、それはそのプロセスの環境に影響を与え、そしてCMDは、発信者がで実行されていないことを

    注意:q.batEXITを使用する場合、呼び出し元のプロセスは終了しません。


SETLOCAL CMDコマンドは、現在のスクリプトのための新しい環境を作成します。その環境の変更は呼び出し側に影響しません。偶発的な環境変化のリークを防ぐため、一般的にはSETLOCALが良い方法です。これは、親環境へのXとYの値をプッシュします

 
    ENDLOCAL && SET X=%X% && SET Y=%Y% 

SETLOCALを使用して、まだ呼び出し元のスクリプトに環境の変化をプッシュする、とスクリプトを終了する


あなたが別のプロセス(ないCMDスクリプト)を実行すると、それはツールが必要な変更を行い、バッチファイルを生成持っているよりも、現在のスクリプトの環境に影響を与えてい一方であれば、実行そのバッチファイル。

 
    REM q.exe will write %TEMP%\runme.cmd, which looks like: 
    REM  set X=Y 
    q.exe 
    call "%TEMP%\runme.cmd" 

関連する問題