如何在 Linux 上使用 Python 导出
- 2024-10-31 08:38:00
- admin 原创
- 53
问题描述:
我需要在 Python 中进行如下导出:
# export MY_DATA="my_export"
我尝试过这样做:
# -*- python-mode -*-
# -*- coding: utf-8 -*-
import os
os.system('export MY_DATA="my_export"')
但是当我列出导出时,“MY_DATA”没有出现:
# export
如何使用 Python 进行导出而不将“my_export”保存到文件中?
解决方案 1:
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 its local environment
当最底层的/bin/sh
子进程完成运行您的export ...
命令时,它将与您刚刚更改的环境一起被丢弃。
解决方案 2:
你实际上想做
import os
os.environ["MY_DATA"] = "my_export"
解决方案 3:
如果您时间紧迫,并且不介意这种黑客行为的后遗症,那么另一种方法是在 bash 环境中执行 python 脚本的输出,并打印出在 python 中设置环境时要执行的命令。这种方法并不理想,但可以在紧急情况下完成工作。它在 shell 之间的可移植性不强,所以 YMMV。
$(python -c 'print "export MY_DATA=my_export"')
(在某些 shell 中你也可以将语句括在反引号中 ``)
解决方案 4:
没那么简单:
python -c "import os; os.putenv('MY_DATA','1233')"
$ echo $MY_DATA # <- empty
但:
python -c "import os; os.putenv('MY_DATA','123'); os.system('bash')"
$ echo $MY_DATA #<- 123
解决方案 5:
我有一个很好的答案。
#! /bin/bash
output=$(git diff origin/master..origin/develop | \npython -c '
# DO YOUR HACKING
variable1_to_be_exported="Yo Yo"
variable2_to_be_exported="Honey Singh"
… so on
magic=""
magic+="export onShell-var1=\""+str(variable1_to_be_exported)+"\"
"
magic+="export onShell-var2=\""+str(variable2_to_be_exported)+"\""
print magic
'
)
eval "$output"
echo "$onShell-var1" // Output will be Yo Yo
echo "$onShell-var2" // Output will be Honey Singh
Alex Tingle 先生对这些流程和子流程的理解是正确的
如何实现就像我上面提到的那样。关键概念是:
来自 python 的任何内容都将存储在[ ]
printed
中的捕获变量中bash
`output`我们可以使用以下方式以字符串形式执行任何命令
eval
print
因此,用有意义的bash
命令准备python 的输出使用
eval
在 bash 中执行它
您可以看到结果
注意:
一定要执行eval
使用double quotes
,否则bash
会弄乱你的`
`s 并且输出会很奇怪
PS:我不喜欢 bash,但你必须使用它
解决方案 6:
我最近不得不在 CI 系统上做类似的事情。我的选择是完全用 bash 来做(哎呀)或者使用 python 之类的语言,这样编程逻辑会简单得多。
我的解决方法是用 python 进行编程并将结果写入文件。然后使用 bash 导出结果。
例如:
# do calculations in python
with open("./my_export", "w") as f:
f.write(your_results)
# then in bash
export MY_DATA="$(cat ./my_export)"
rm ./my_export # if no longer needed
解决方案 7:
您可以尝试 os.environ["MY_DATA"] 。
解决方案 8:
有点像黑客行为,因为这里实际上不是 python 做任何特殊的事情,但如果你在同一个子 shell 中运行导出命令,你可能会得到你想要的结果。
import os
cmd = "export MY_DATA='1234'; echo $MY_DATA" # or whatever command
os.system(cmd)
解决方案 9:
希望能够澄清常见的混淆问题......
我已经编写了许多 python <--> bash <--> elfbin 工具链,查看它的正确方法如下:
每个进程(发起者)都具有从调用者那里继承的环境状态。任何更改都只限于该进程。传输环境状态本身就是一个功能,并且以两个方向运行,每个方向都有自己的注意事项。最常见的是在运行子进程之前修改环境。要深入了解,请查看 C 中的 exec() 调用。有一种变体采用指向环境数据的指针。这是典型操作系统中唯一实际支持的环境传输。
执行export时,Shell 脚本将创建一个状态,以便在运行子进程时传递。否则,它只会使用它最初获得的状态。
在所有其他情况下,它将是一些通用机制,用于传递一组数据,以允许调用进程本身根据子进程输出的结果更新其环境。
前任:
ENVUPDATE = $(CMD_THAT_OUTPUTS_KEYVAL_LISTS)
echo $ENVUPDATE > $TMPFILE
source $TMPFILE
当然,只要您有解释和应用的工具,就可以使用 json、xml 或其他东西来完成相同的操作。
这种需要可能是(50% 的机会)误解了基本原语的迹象,并且您需要在解决方案中更好地配置或参数交换.....
哦,在 python 中我会做类似的事情......(需要根据您的情况进行改进)
import re
RE_KV=re.compile('([a-z][w]*)s*=s*(.*)')
OUTPUT=RunSomething(...) (Assuming 'k1=v1 k2=v2')
for kv in OUTPUT.split(' ')
try:
k,v=RE_KV.match(kv).groups()
os.environ[k]=str(v)
except:
#The not a property case...
pass
解决方案 10:
一行解决方案:
eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'`
echo $python_include_path # prints /home/<usr>/anaconda3/include/python3.6m" in my case
分解:
Python 调用
python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'
它启动一个 Python 脚本,
导入系统配置
获取与此 python 二进制文件对应的 python 包含路径(使用“哪个 python”查看正在使用哪一个)
打印脚本“python_include_path={0}”,其中 {0} 是来自 2 的路径
评估调用
eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'`
它在当前 bash 实例中执行来自 python 脚本的输出。在我的例子中,它正在执行:
python_include_path=/home/<usr>/anaconda3/include/python3.6m
换句话说,它正在为此 shell 实例使用该路径设置环境变量“python_include_path”。
灵感来自:
http: //blog.tintoy.io/2017/06/exporting-environment-variables-from-python-to-bash/
解决方案 11:
import os
import shlex
from subprocess import Popen, PIPE
os.environ.update(key=value)
res = Popen(shlex.split("cmd xxx -xxx"), stdin=PIPE, stdout=PIPE, stderr=PIPE,
env=os.environ, shell=True).communicate('y
y
y
'.encode('utf8'))
stdout = res[0]
stderr = res[1]
解决方案 12:
如果调用脚本是python,那么使用subprocess.run
更合适。你可以将修改后的环境字典传递给env
的参数subprocess.run
。
以下是分步指南:
1]导入子进程模块:确保已在 Python 脚本中导入子进程模块。
import subprocess
import os
2] 准备环境变量:根据需要创建或修改环境变量。您可以从当前环境的副本开始,然后使用特定变量对其进行更新。
# Copy the current environment
env = os.environ.copy()
# Set your custom environment variables
env["MY_VARIABLE"] = "value"
env["ANOTHER_VARIABLE"] = "another value"
3] 使用自定义环境调用 subprocess.run:使用 env 参数将您的自定义环境传递给子进程。
# Call the subprocess with the custom environment
result = subprocess.run(["your_script.sh"], env=env)
将“your_script.sh”替换为您的脚本或命令的路径。
4] 可选:处理结果:您可以根据需要处理子进程调用的结果,例如,检查脚本是否成功运行。
if result.returncode == 0:
print("Script executed successfully")
else:
print("Script failed with return code", result.returncode)
解决方案 13:
os.system('/home/user1/exportPath.ksh')
导出路径.ksh:
export PATH=MY_DATA="my_export"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件