🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OS

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Python

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

Q&A

解決済

4回答

1373閲覧

Pythonでの環境変数と、システム→システムの詳細設定で見れる環境変数の違いは?

koyamashinji

総合スコア45

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OS

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Python

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

0グッド

1クリップ

投稿2020/12/05 02:04

Windows10を使っています。

  • pythonのos.getenvironで取得できる環境変数の一覧
  • 「システム」→「システムの詳細設定」→「環境変数」で取得できる環境変数の一覧

 

上記では、環境変数の一覧の取得内容が異なります
(例えば、pythonではos.environ["TF_FORCE_GPU_ALLOW_GROWTH"]= "true"という変数を設定しましたが、
「システム」のGUIから確認できる環境変数の一覧には含まれていません。)

それぞれの違いは何でしょうか。参照先が違うのでしょうか?
(調べましたが、カーネルシェル変数環境変数親プロセス子プロセス・・・等の言葉で混乱しなかなか理解に及ばず・・)

素人質問だとは思いますがわかりやすく教えてくださる方、お願いいたします。


Python

1import os 2print(os.environ)

イメージ説明

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

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

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

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

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

guest

回答4

0

ベストアンサー

それぞれの違いは何でしょうか。参照先が違うのでしょうか?

その通りです。

OS内で多数のプロセスが動いていますが、環境変数はそれぞれのプロセス毎の独自の値で、プロセスが異なれば環境変数の内容も異なります。
プロセス稼働中にプログラムで変更することも可能です。

それぞれのプロセスの環境変数は、
・Explorerから起動されたプロセスは、起動時点の環境変数はOSの設定画面で設定した値
・その他のプロセスから起動されたプロセスは、起動時点の親プロセスの環境変数が、起動時点の子プロセスの環境変数の値となる
・もちろんプログラムでは自プロセスの環境変数は自由に変更できる
という関係があります。

ということなので、

・プログラム内で環境変数の追加削除変更をしていない限りは、OSの設定画面の内容が、子プロセス、孫プロセスと同じ内容で引き継がれます。
・もし子プロセスが環境変数を変更すると、それ以降に生まれた子孫プロセスは、OSの設定画面の内容と異なる環境変数を持ちます。
・子プロセスが環境変数を変更しても、変更後に生まれた子孫プロセス以外のプロセス(親プロセスや兄弟プロセスなど)の環境変数には影響しません。

投稿2020/12/05 03:30

otn

総合スコア85886

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

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

koyamashinji

2020/12/05 04:37

ご回答誠に有難うございます。大変勉強になります。 >・Explorerから起動されたプロセスは、・・・ >・その他のプロセスから起動されたプロセスは、・・・ 「Explorerから起動されたプロセス」とは、所謂我々がデスクトップのアイコンをクリックし開くアプリケーション等が該当するかと思いますが、 「その他のプロセスから起動されたプロセス」とは、例えばWindowsの例ですとどのようなものが挙げられるでしょうか。いまいちイメージがつかめず。 あと、今回の私のケースでは、 親プロセス=Windows10 OS 子プロセス=python という考え方で間違っていないでしょうか。 無知で恐縮ですが是非お願いします。
otn

2020/12/05 07:00

> 「その他のプロセスから起動されたプロセス」とは、例えばWindowsの例ですとどのようなものが挙げられるでしょうか。いまいちイメージがつかめず。 例えばコマンドプロンプトを起動して、 set AAA=123 と環境変数AAAを設定して、そのコマンドプロンプトでPythonと打ってPythonを起動すると、Pythonで参照する環境変数にAAAが増えています。 追加じゃなくて、環境変数設定画面で設定してある変数の値をsetで変更しても、同じくコマンドプロンプトから起動したプログラムに引き継がれます。 ということで、 > あと、今回の私のケースでは、 > 親プロセス=Windows10 OS > 子プロセス=python > という考え方で間違っていないでしょうか。 は、間違っています。 上記のケースだと、 親:Explorer、子:コマンドプロンプト 親:コマンドプロンプト、子:Python(Explorerから見ると孫)
ppaul

2020/12/05 09:25

プロセスが他のプロセスを起動できることが良くわからないのであれば、pythonで以下を実行してみてください。 >>> import subprocess >>> subprocess.run(["explorer.exe"]) こうすると、今動いているpythonの子プロセスであるexplorerが起動されます
koyamashinji

2020/12/05 10:34

otn様、ppaul様  大変勉強になりました。誠に有難うございます。
guest

0

環境変数には種類があります。

そのWindowsのGUI上で設定できるのは「システム環境変数」と「ユーザー環境変数」です。
前者はWindowsのシステム全体に有効な変数であり、後者はログインしているユーザーのみに有効な変数です。
これらはレジストリに保存され、システム起動時や、ユーザーのログイン時に初期化されます。

その他、プログラム実行中には、特別に指定しない限り、そのプロセス内でのみ有効な環境変数を扱えます。
あなたがPythonで扱っているのはコレです。
(なお同一の環境変数はシステム→ユーザー→プロセスの順で上書きされます)

プロセス内でのみ有効なため、システム環境変数やユーザー環境変数を変更するものではありません。ただ追加または上書きをするだけです。そのプログラムのプロセスから派生したプロセスには受け継がれますが、それ以上に何かを変更するような影響のあるものではありません。

Pythonでその手の作業をやったことがないので詳しくはありませんが、システム環境変数やユーザー環境変数をプログラム上から書き換えるには、レジストリを操作する特別なコマンドが必要になるはずです。(レジストリを直接書き換えるか、またはそれを行ってくれるライブラリを使う必要がある)

投稿2020/12/05 03:12

編集2020/12/05 03:13
gentaro

総合スコア8947

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

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

koyamashinji

2020/12/05 10:35

gentaro様、大変有用な情報をいただき勉強になりました。もっと精進いたします。
guest

0

それぞれの違いは何でしょうか。参照先が違うのでしょうか?

「環境変数」という言葉が悪いのかも知れませんが…。そこから勝手なイメージ作って説明する人がいるのが原因になるのでしょうかね。
「環境変数」というのは「機器内で持ってる共通の情報にアクセスする仕組み」ではないですよ。
「プロセスを生成する際に情報をコピーして引き継ぐという習慣によって、システム共通的な設定を疑似的に共有する手段」です。

なので、生み出されたプロセス ( この場合はpython ) で環境変数をいじっても、生み出した元の方へは影響はありません。あくまでコピーされているだけなので。
また、あくまで「生成する際に情報をコピー」なので、あとから変更しても、既に生成された他のプロセスへは反映されません。
※反映に再実行や再起動が必要になるのはそのため

「システム」→「システムの詳細設定」→「環境変数」で取得できる環境変数の一覧

詳しくは分かりませんが、「色々なプログラムを実行する元となる始原的なプログラムに持たせる情報」ということになろうかと思います。
一応、保管場所がレジストリのHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentなので、「セッションマネージャ(smss.exe)」が、その「始原的なプログラム」に相当するかと思います。

投稿2020/12/05 03:08

angel_p_57

総合スコア1681

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

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

koyamashinji

2020/12/05 10:36

angel_p_57様、下名の中で「環境変数」の定義がより明確になりました。ご教示頂きまして有難うございます。
guest

0

OSの環境中で使うものと、pythonの環境中でしか使わないものとの違いかと。
まあ、参照先がそもそも違いますね

投稿2020/12/05 02:08

y_waiwai

総合スコア88038

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

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

koyamashinji

2020/12/05 10:37

ご回答いただきありがとうございました。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問