如何在 Linux 上使用 Python 导出

2024-10-31 08:38:00
admin
原创
54
摘要:问题描述:我需要在 Python 中进行如下导出:# export MY_DATA="my_export" 我尝试过这样做:# -*- python-mode -*- # -*- coding: utf-8 -*- import os os.system(&#039...

问题描述:

我需要在 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 先生对这些流程和子流程的理解是正确的

如何实现就像我上面提到的那样。关键概念是:

  1. 来自 python 的任何内容都将存储在[ ]printed中的捕获变量中bash`output`

  2. 我们可以使用以下方式以字符串形式执行任何命令eval

  3. print因此,用有意义的bash命令准备python 的输出

  4. 使用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(&#039;([a-z][w]*)s*=s*(.*)&#039;)

OUTPUT=RunSomething(...) (Assuming &#039;k1=v1 k2=v2&#039;)

for kv in OUTPUT.split(&#039; &#039;)
  try:
    k,v=RE_KV.match(kv).groups()
    os.environ[k]=str(v)
  except:
    #The not a property case...
    pass

解决方案 10:

一行解决方案:

eval `python -c &#039;import sysconfig;print(&quot;python_include_path={0}&quot;.format(sysconfig.get_path(&quot;include&quot;)))&#039;`
echo $python_include_path  # prints /home/&lt;usr>/anaconda3/include/python3.6m&quot; in my case

分解:

Python 调用

python -c &#039;import sysconfig;print(&quot;python_include_path={0}&quot;.format(sysconfig.get_path(&quot;include&quot;)))&#039;

它启动一个 Python 脚本,

  1. 导入系统配置

  2. 获取与此 python 二进制文件对应的 python 包含路径(使用“哪个 python”查看正在使用哪一个)

  3. 打印脚本“python_include_path={0}”,其中 {0} 是来自 2 的路径

评估调用

eval `python -c &#039;import sysconfig;print(&quot;python_include_path={0}&quot;.format(sysconfig.get_path(&quot;include&quot;)))&#039;`

它在当前 bash 实例中执行来自 python 脚本的输出。在我的例子中,它正在执行:

python_include_path=/home/&lt;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(&quot;cmd xxx -xxx&quot;), stdin=PIPE, stdout=PIPE, stderr=PIPE,
            env=os.environ, shell=True).communicate(&#039;y
y
y
&#039;.encode(&#039;utf8&#039;))
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[&quot;MY_VARIABLE&quot;] = &quot;value&quot;
env[&quot;ANOTHER_VARIABLE&quot;] = &quot;another value&quot;

3] 使用自定义环境调用 subprocess.run:使用 env 参数将您的自定义环境传递给子进程。

# Call the subprocess with the custom environment
result = subprocess.run([&quot;your_script.sh&quot;], env=env)

将“your_script.sh”替换为您的脚本或命令的路径。

4] 可选:处理结果:您可以根据需要处理子进程调用的结果,例如,检查脚本是否成功运行。

if result.returncode == 0:
    print(&quot;Script executed successfully&quot;)
else:
    print(&quot;Script failed with return code&quot;, result.returncode)

解决方案 13:

os.system('/home/user1/exportPath.ksh')

导出路径.ksh:

export PATH=MY_DATA=&quot;my_export&quot;

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用