[解決済み] PythonでBashの'source'をエミュレートする
質問
以下のようなスクリプトがあります。
export foo=/tmp/foo
export bar=/tmp/bar
ビルドするたびに 'source init_env' (init_envは上記のスクリプト) を実行して、いくつかの変数をセットアップしています。
Pythonで同じことを達成するために、私はこのコードを実行させていました。
reg = re.compile('export (?P<name>\w+)(\=(?P<value>.+))*')
for line in open(file):
m = reg.match(line)
if m:
name = m.group('name')
value = ''
if m.group('value'):
value = m.group('value')
os.putenv(name, value)
しかし、その後に
誰か
に次のような行を追加するのがいいと考えました。
init_env
ファイルに追加するのがいいと思いました。
export PATH="/foo/bar:/bar/foo:$PATH"
明らかに私のPythonスクリプトは崩壊しています。この行を処理するようにPythonスクリプトを修正することもできますが、そうすると後で
誰か
で使用する新しい機能を思いついたときに壊れるだけです。
init_env
ファイルで使用する新しい機能を思いつきました。
問題は、Bash コマンドを実行し、私の
os.environ
?
どのように解決するのですか?
あなたのアプローチの問題は、bashスクリプトを解釈しようとしていることです。まず、export ステートメントを解釈しようとするだけです。それから、人々が変数展開を使用していることに気づきます。その後、人々はファイルに条件分岐を入れたり、置換を処理したりするようになります。最終的には、バグだらけのbashスクリプトインタプリタが完成します。そんなことはしないでください。
Bashにファイルを解釈させ、その結果を収集する。
こんな感じでできます。
#! /usr/bin/env python
import os
import pprint
import shlex
import subprocess
command = shlex.split("env -i bash -c 'source init_env && env'")
proc = subprocess.Popen(command, stdout = subprocess.PIPE)
for line in proc.stdout:
(key, _, value) = line.partition("=")
os.environ[key] = value
proc.communicate()
pprint.pprint(dict(os.environ))
bashが失敗した場合のエラーを処理することを確認してください。
source init_env
に失敗した場合、bash自体の実行に失敗した場合、サブプロセスがbashの実行に失敗した場合、その他のエラーに対処してください。
は
env -i
はクリーンな環境を作ります。つまり、環境変数は
init_env
もし、システム環境を継承したい場合は
env -i
.
のドキュメントを読んでください。 サブプロセス のドキュメントを読んでください。
注意: これは
export
ステートメントで設定された変数のみを捕捉します。
env
はエクスポートされた変数のみを表示します。
お楽しみに。
なお、この
Python ドキュメント
には、環境を操作したい場合は
os.environ
を使うのではなく、直接
os.putenv()
. 私はそれをバグだと考えていますが、余談です。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複