2016-09-25 10 views
0

私はperlからPythonに翻訳したコードをいくつか持っていますが、この最後の部分を理解しようとしています。私はこれが何をしているか(ビット)を理解しながらperlからpython

my $bashcode=<<'__bash__'; 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
__bash__ 
my $var1; 
eval qx(bash -c "$bashcode"); 

、私はPythonでこれを実行する方法を見つけるように見えることはできません。どんな助けでも大歓迎です。

+1

'os.system( "bashの-c" + bashcodeを)'を使用、Pythonでホスト環境にアクセスするには、小文字env

で環境にアクセスしますか? –

+0

'data :: dumper'によって生成されたPerlishフォーマットで特別に必要としない限り、環境のダンプを取得するためにPerlを使うだけでは不思議そうです。シェルの 'env'だけがあなたに必要な出力を与えるはずです。 PerlやPythonから 'bash -c 'コードを呼び出すかどうかは重要ではありません。唯一の疑問は、なぜこれが明らかにBashタスクであるかを*使用している理由です。タスクがこれらの変数をPythonにインポートするのであれば、おそらく['shlex'](https://docs.python.org/3/library/shlex.html)を見てください。 – tripleee

+0

既存のコードでは、bashスクリプトを使用していくつかの環境変数を設定し、変更された環境を元のperlスクリプトに戻すために、bashスクリプトからperl形式でダンプします。その部分を(おそらく 'bashスクリプトの3行目の' env'で)置き換え、 'pythonの方法で' bash -c ... 'を実行し、出力をキャプチャして解析する必要があります。 – ysth

答えて

1

プログラムがスクリプトを生成して実行しています。

最初のPythonの近似は次のとおりです。

import os 
script=""". /opt/qip/etc/qiprc; 
      . /opt/sybase/sybase.sh 
      perl -mdata::dumper -e 'print dumper \%env'; 
""" 
os.system(script) 

あなたが見ることができるように、perlはまだモジュールのデータを使用しているスクリプト内で使用されている::ダンパー。ここでPythonを使用したい場合は、同等のモジュールが必要な場合があります。

+0

はい、それは私が立ち往生している場所です。投稿された例は、元のperlスクリプトからのものです。私はPythonコードでそれを使用していませんが、私はそれをPythonに相当するものに翻訳する方法を理解したいと思います。 – mrthingfish

+0

私は、あなたの環境変数を読み込み可能な方法でダンプすると思う。シェルコマンド "env"を使うだけで十分です。 – sureshvv

+0

'%env'は'%ENV'と同じではありません。それが '%env'にあるかもしれませんが、そうであることを確認する際にはおそらく価値があります。 – stevieb

0

この部分:

my $bashcode=<<'__bash__'; 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
__bash__ 

は、ここではドキュメントであり、あなたは、Pythonでこれを行うだろう:

bashcode="""\ 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
""" 

あなたはos.systemまたはsubprocess.check_outputのようなものを使用してバッシュに支払うでしょう。

その結果はevalに送られ、Perlコードとして実行されます。

(この知恵と、evalの結果は、これらのBashコマンドの生成内容に依存します)これらのコマンドはPerlスクリプトを生成しているように見えますが、明らかにPythonでは実行されません。 evalを任意の言語で慎重に使用してください)。

\%envをPerlで使用すると、ホストの環境にアクセスしているように見えます。ただし、OS環境ハッシュにアクセスする実際のPerl変数は、大文字のENVです。 bashで、あなたはos.environ