質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

7475閲覧

環境変数のメリットは何ですか?

masa_00

総合スコア6

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/09/12 05:34

編集2020/09/12 05:58

環境変数についての質問

Pythonを使用していて、環境変数を扱うcodeに触れたので質問させていただきます。

環境変数を使用するメリットとは、何なんでしょうか?

調べても、そもそも環境変数は〜という話が多く、ずばり、
環境変数がある場合とない場合で結果がどう変化するからメリットがあるのかが、イメージできません

あまり大事な部分ではないのかな?と思っているのですが、
もし詳しい方がいらっしゃいましたら、教えていただきたいです。

<実際に直面したcode例>

ex.python

1seed = 111 2random.seed(seed) 3os.environ['SEED'] = str(seed)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/12 05:52

「どのような手法と比較して」の環境変数のメリットでしょうか? (例えば、「パスを通す」のは環境変数以外の手段がほぼありません)
masa_00

2020/09/12 06:00

参考にしたプログラムでは、乱数を設定する際に上記のプログラムを動かしていました。 意図がわからないため、どのような手法か答えられず、申し訳ありません。
Zuishin

2020/09/12 06:05

いくら探しても「環境変数は〜」の説明に使用法が全く含まれていなかったというのは信じがたいことですが、メリットとは「どう使うか」のことではないんでしょうか? 環境変数にはもっと良い代替手段があるということなら質問の主旨もわかりますが、それは Python の変数と比べていますか?
maisumakun

2020/09/12 06:10

> 参考にしたプログラムでは、乱数を設定する際に上記のプログラムを動かしていました。 ここでセットした環境変数は、あとあとどういった形で使われるのでしょうか?
Zuishin

2020/09/12 06:11

返事がないけど、SEED じゃなく PYTHONHASHSEED じゃないですかね。
masa_00

2020/09/12 06:57

そうです!PYTHONHASHSEEDです。 このプログラムを記入する意図はどういうものが考えられますか?
guest

回答4

0

ベストアンサー

環境変数 PYTHONHASHSEED は Python がハッシュを作成するときのシードを指定します。ちょっと難しい概念で、環境変数と一緒に語るのも何なので、別に質問した方が良いと思います。

これを環境変数で指定する理由、つまり環境変数で指定することによるメリットのみ説明します

前提 1. 環境変数は OS の管理下にあり、子プロセスに渡される

たとえば Windows や Linux のことを OS と言います。そして Python などユーザーが指定して OS から起動されたプログラムは**「プロセス」という実行環境**を作ります。プロセスを雑に言うと、あるプログラムと別のプログラムが同じメモリを互いに書き換えて暴走しないようプログラム毎に隔離された空間や、その空間で実行されているプログラムそのもののことです。

たとえば、Python を一度実行するとプロセスが一つ作られてその中で Python が動き、その処理中にもう一度 Python を実行するとプロセスがもう一つ作られて二つのプロセスが同時に動きます。

プロセスは子プロセスを作ることができます。例えばコマンドプロンプトやターミナルを立ち上げるとプロセスが一つ作られ、そこから Python を立ち上げると Python のプロセスが作られます。ターミナルから作られた Python のプロセスはターミナルの子プロセスと呼ばれます。

環境変数は OS によって管理される変数で、プロセスが一つできるたびに OS から環境変数の一覧が渡されます。そしてその環境変数は子プロセスへと引き継がれます。

たとえば Python でグローバル変数を作り、関数を呼ぶと、その関数からはグローバル変数を参照できますが、逆にその関数内部で作られた変数は関数の外から参照できません。このようなスコープがプロセス単位で環境変数にもあります。

前提 2. ターミナルの環境変数は Python から書き換えることができる

OS から渡された環境変数はプロセス内部で書き換えることができますが、書き換えた環境変数はプロセスの外の環境からは参照できません。子プロセスには親プロセスの書き換えた環境変数が渡されますが、子プロセスで書き換えたものは親プロセスからは参照できません。

さて、ターミナルを立ち上げると、ターミナルは環境変数を保持し、そこから立ち上がる子プロセスに自分の環境変数を渡します。

これはつまり、同じターミナルから立ち上げる限り、Python を何度起動しても同じターミナルの環境変数が渡されるということです

ここで立ち上げられた Python が os.environ['PYTHONHASHSEED'] を設定すると、その親プロセス、つまりターミナルの環境変数を書き換えることができます。つまり、次にターミナルから立ち上げられるプロセスには、書き換え後の環境変数が渡されるということです。

環境変数を使うメリット 1 - コマンドライン引数や設定ファイルが不要

Python を数度立ち上げる場合、それはすべて別のプロセスになります。したがって、前回立ち上げられた時のことは忘れています。

それを再設定するため、コマンドライン引数で渡したり、設定ファイルに書いておいて起動時に読み込んだりします。

しかし、コマンドライン引数を実行のたびにいちいち指定するのは面倒ですし、設定ファイルだと編集するのが面倒です。その点環境変数なら、一度設定しておけばターミナルが生きている限り覚えていてくれるため、手軽に設定できます。

環境変数を使うメリット 2 - ターミナルを再起動すると忘れる

ずっと同じ値を使うのであれば設定ファイルが便利です。一度設定すれば書き換えない限りずっと使うことができます。しかし、その日の作業だけに使う一時的な値であれば、それを残す必要はありません。

一時的に環境変数を設定し、Python を何度か立ち上げて作業をし、作業が終わればターミナルを終了させることで消えてなくなるので、後になって不要になった設定ファイルに悩むことはありません。

環境変数を使うメリット 3 - 設定の手順が統一される

メリット 2 と反しますが、それでもその値を残しておく方が便利なことがあります。その場合は .rc などのターミナルの初期化ファイルに書いておけば、ターミナルを起動するたびに再設定することができます。

2 と合わせて、いつもはこの値を使うけれど今日だけはこの値を使う、のように使い分けることもできます。

環境変数を使うメリット 3 - 複数のプログラムで値を共有できる

通常はこれが主なメリットになります。それぞれのプログラムがそれぞれの設定ファイルを使っていたのでは連携に劣りますが、環境変数を使うことによって複数のプログラムが同じ値を参照することができ、連携を取りやすくなります。

投稿2020/09/12 07:44

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/09/12 07:54

ハッシュとシードについて一応簡単に説明すると、ハッシュというのはあるデータから作られる別のデータであり、もともとのデータが異なればハッシュも異なる確率が高いよう期待して作られるものです。 Python は辞書を作る時などにこのハッシュを利用します。ハッシュ同士を比較するのは長い文字列同士を比較することより速く、また整数値として作られたハッシュはリストのインデクスにもなることができるため、ハッシュセットなどの作成に役立ちます。 シードを外から与えることにより、ハッシュの作成を固定化することができるので、機械学習などでハッシュのゆらぎが邪魔になる場合などによく使われます。 https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHONHASHSEED
guest

0

<実際に直面したcode例>

このような、プログラム内から環境変数を書き換えるようなコードは、「子プロセスに引き継ぐ環境変数を変更する」あるいは「dotenvのように、環境変数設定を別の手段で代替するため、初期化時に1回だけ行う」など、明確な目的があるのでなければ書くべきではありません

環境変数はグローバル変数より影響範囲が広いので、プログラム内で書き換えを繰り返すと、どこで書き込んだ値がどこに影響しているのか判然としなくなり、動作が把握しづらくなります。

投稿2020/09/12 06:03

編集2020/09/12 06:04
maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/12 06:06

もちろん、書き込んだ環境変数を誰も参照しないのであれば害はありませんが、書き込む意味自体もありません。 通常、環境変数は「プログラムの外側で設定して、プログラム内からは読み込むだけ」という形で運用します。
guest

0

私も知らなかったのでググってみました。
結構、wikipediaに細かく説明が載っています。機密保持の面もあるんですね。

利点

環境変数は以下の利点を持つ。
OSレベルでの事実上の標準機能である
Linux・MacOS・Windows・Android等に存在
ほぼすべてのプログラミング言語でアクセス可能
アプリケーションの言語に依存しない
OSレベルでありアプリケーションのプログラミング言語がCでもNode.jsでも利用可能
単純である
アプリケーション外にKeyValueペアで存在する変数、というシンプルな機能
Key・Valueともに文字列、型等をもたない
利用
環境変数は様々な用途で利用される。
機密情報の挿入
環境変数はアプリケーションへ機密情報(Credentials)を渡すために用いられる。
アプリケーションコードはしばしばGit等のバージョン管理ソフトで管理され、レポジトリに登録される。レポジトリに登録されるコードは特定・不特定多数に見られることを前提としているが、機密情報はむしろそれを避ける必要がある。ゆえにコードと機密情報を分離し、コードの実行時に機密情報を渡す仕組みが必要になる。
機密情報を渡す方法の1つは、バージョン管理から除外された設定ファイルである[3]。プログラム実行時の引数としてこの設定ファイルを渡すことで機密情報を利用できるが、設定ファイルはコードと同じ「ファイル」であり、レポジトリへ誤ってコミットされ機密情報が暴露されるリスクがある。
アプリケーション外からのデータ挿入において、環境変数がもつ単純さ・言語非依存性・OS間可搬性は大きなメリットを持つ[4]。また環境変数はファイルでないため誤コミットのリスクは小さい[5]。そのため特にクラウドネイティブアプリケーションのベストプラクティスとして、機密情報の挿入に環境変数が用いられる[6]。
環境変数 wikipedia

投稿2020/09/12 05:40

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

The Twelve-Factor Appという、かなり有名なWebアプリケーション作成のための原則集があります。
https://12factor.net/ja/

この中で、III. 設定 において、設定情報は、設定ファイルなんか使わずに、環境変数を使いなさい、と主張している項目があります。

The Twelve-Factor Appの全てを厳格に守るのは、あまりお勧めしませんが、こういうものがあって、それなりに有名であることは、知識として知っておくとよいと思います。

投稿2020/09/12 07:13

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問