ここから本文です

はじめまして。 Linuxの勉強をしておりまして、 pythonから、os.environでOS依存...

unk********さん

2017/10/1601:02:51

はじめまして。
Linuxの勉強をしておりまして、
pythonから、os.environでOS依存せずに、
環境変数の追加をしようと試みましたが、うまくいかず躓いております。

---環境---
OS : Linux mint mateEdition 18.2
python : 2.7.12
shell : bash
------------

具体的には、
まずbashのコマンドでまず普通に環境変数が定義できるか確認しました。
export AAA=value
envコマンドで確認するとAAAが確認できましたので問題ありませんでした。

次に、pythonで例えば
import os
os.environ["BBB"] = "value"
print os.environ.get("BBB")
等とすると実行時にはBBBがプリントされます。
しかし、直後にenvコマンドで確認すると、BBBの存在が見当たりませんでした。

また、試しにpythonのsubprocessライブラリからshellコマンドを実行しようとしました。
import subprocess
cmd = ["export"," CCC=value"]
subprocess.check_call(cmd)

等としても、以下のようなエラーが帰ってきます。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 536, in check_call
retcode = call(*popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory


なにか原因はご存知でしょうか?
ご存じの方いらっしゃいましたら、ご教示願い申し上げます。
宜しくお願い申し上げます。

閲覧数:
104
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

ikt********さん

2017/10/1608:59:58

Pythonの話じゃなくて、
・環境変数 そのもの
について、勘違いなさっているのでは?

少なくともunix系OSでは、環境変数 は、
・プロセス の属性
・親プロセス から 子プロセス に、
・一方通行で引き継がれる(逆方向 親←子 はない)
ものです。

シェルで export AAA=value した場合、
・そのシェルプロセス自身
・そのシェルから起動した子プロセス(コマンドやシェルスクリプト)
には伝わるけど、逆はない。

export AAA=value
env
だけのスクリプトを作り、ログインシェルから実行
してみてください。
上記スクリプトの env では AAA が出てくるでしょうが、
その後ログインシェルで env しても AAA は出てこない
はずです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/10/16 13:59:54

iktkttnさん

失礼致しました。
わかりやすくご解説有難う御座いました。
私の理解が足りておりませんでした。

ようやく理解できました。
有難う御座いました。
とても勉強になりました。

ベストアンサー以外の回答

1〜1件/1件中

mer********さん

2017/10/1612:54:51

>しかし、直後にenvコマンドで確認すると、BBBの存在が見当たりませんでした。

子プロセス(python)で環境変数を操作しても、親プロセス(シェル)には影響しません。

>等としても、以下のようなエラーが帰ってきます。

shell=Trueがない場合、(おそらく)exec系システムコールで実行されますので、シェルの機能は使えません。
exportというのはシェルの内部コマンドであり、/usr/bin/exportとかが存在しているわけではありませんので、この方法では実行できません。
shell=Trueをつければ実行は一応できますが、やはり、子プロセス(subprocessで起動されたシェル)で環境変数を操作しても、親プロセス(python)やそのまた親プロセス(pythonを起動したシェル)には影響しません。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo!知恵袋カテゴリ

一覧を見る

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる