如何在Linux上使用Python导出

Kev*_*ion 56 python linux export

我需要在Python中进行这样的导出:

# export MY_DATA="my_export"
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

# -*- python-mode -*-
# -*- coding: utf-8 -*-
import os
os.system('export MY_DATA="my_export"')
Run Code Online (Sandbox Code Playgroud)

但是当我列出导出时,"MY_DATA"不会出现:

# export
Run Code Online (Sandbox Code Playgroud)

如何在不将"my_export"保存到文件中的情况下使用Python进行导出?

ale*_*gle 79

export是一个直接提供给shell的命令(例如bash),告诉它添加或修改其中一个环境变量.您无法从子进程(例如Python)更改shell的环境,这是不可能的.

以下是您尝试发生的事情os.system('export MY_DATA="my_export"')......

/bin/bash process, command `python yourscript.py` forks python subprocess
 |_
   /usr/bin/python process, command `os.system()` forks /bin/sh subprocess
    |_
      /bin/sh process, command `export ...` changes local environment
Run Code Online (Sandbox Code Playgroud)

当最底部的/bin/sh子进程完成运行export ...命令时,它将被丢弃,以及刚刚更改的环境.

  • 经过大量的测试后,我才意识到,你是对的:我无法从子进程(如Python)改变shell的环境,这是不可能的. (11认同)
  • @KevinCampion请在这种情况下更改接受的答案. (9认同)

Ale*_*lex 72

你真的想做

import os
os.environ["MY_DATA"] = "my_export"
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并不起作用(尽管这是一种更好的方法):`$ python Python 2.7.10(默认,2015年9月8日,17:20:17)[GCC 5.1.1 20150618(Red Hat 5.1.1-) 4)]在linux2上输入"help","copyright","credits"或"license"以获取更多信息.>>> import os >>> os.environ ["MY_DATA"] ="my_export">>> $ export | grep -c MY_DATA 0` (5认同)

小智 14

另一种方法是,如果你赶时间并且不介意hacky-aftertaste,就是在你的bash环境中执行python脚本的输出并打印出用于在python中设置环境的命令.不理想,但它可以在紧要关头完成工作.它不是很容易穿越贝壳,所以YMMV.

$(python -c 'print "export MY_DATA=my_export"')
Run Code Online (Sandbox Code Playgroud)

(你也可以在一些shell``中用反引号括起语句

  • 其他人可以评论为什么这会被贬低?鉴于所需的要求,这似乎是一个合理的解决方案.它不会启动新的子shell,并且实际上会将新的环境变量添加到当前正在运行的shell进程中. (4认同)

pho*_*oku 7

不那么简单:

python -c "import os; os.putenv('MY_DATA','1233')"
$ echo $MY_DATA # <- empty
Run Code Online (Sandbox Code Playgroud)

但:

python -c "import os; os.putenv('MY_DATA','123'); os.system('bash')"
$ echo $MY_DATA #<- 123
Run Code Online (Sandbox Code Playgroud)

  • 基本上,你刚刚在python之上创建了一个新的bash实例,它位于另一个bash之上 (4认同)
  • 这个解决方案不正确.在包含许多命令的python脚本中,脚本将在创建新bash实例时退出. (2认同)
  • 不要这样做,为环境变量创建一个全新的bash过程实际上是不好的做法. (2认同)