在Python脚本中使用shellvariables不起作用

我有一个shell脚本,其中某些参数被设置为:

k.sh:

export var="value" export val2="value2"

然后我有一个python脚本,我在调用shell脚本,并希望使用这些环境variables

ex1.py:

import subprocess import os subprocess.call("source k.sh",shell=True) print os.environ["var"]

但我得到一个KeyError

我如何在我的Python脚本中使用这些shellvariables?

我可以将父进程的stderrredirect到分支进程上的套接文件描述符吗?

pthread互斥量的开销?

backspace不会在bash中删除tput命令的下划线

新的命令行工具:唯一的名称

一个简单的汇编代码会导致段错误

Linux低级别的鼠标读取

android dumpsys batteryinfo和android dumpsys batterystats

应用程序的响应时间与给定时间段内的input触发的数量非直接相关

在最近的Linux上执行进程堆栈中的代码

在bash中转义variables

你可以源码k.sh 并运行k.sh Python来打印os.environ的内容为JSON。 然后使用json.loads在主进程json.loads输出转换回字典:

import subprocess import os import json PIPE = subprocess.PIPE output = subprocess.check_output( ". ~/tmp/k.sh && python -c 'import os,json; print(json.dumps(dict(os.environ)))'",shell=True) env = json.loads(output) print(env["var"])

产量

value

subprocess.call在一个新的进程中启动一个shell,调用source 。 无法从子进程修改进程中的环境。

如果要设置环境然后运行Python脚本,那么设置环境并使用runner运行Python脚本:

亚军

#! /bin/bash . k.sh exec ex1.py

就是这样。

ex1.py

#import subprocess import os #subprocess.call("source k.sh",shell=True) print os.environ["var"]

正如chepner所指出的那样。 你的子进程部分是单独运行的。 使用环境变量必须在启动python脚本之前完成。

例如:

C:UsersantonDesktopgithubs>echo %x% y C:UsersantonDesktopgithubs>python Python 2.7.3 (default,Apr 10 2012,23:31:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help","copyright","credits" or "license" for more information. >>> import os >>> os.environ['x'] 'y' >>>

然而,在启动脚本之前找到您的环境变量将向下遍历,或者如果您执行了多个子程序调用的命令,那么在您找到它之后也会很棒。 例如:

import subprocess import os x = subprocess.call("source k.sh",shell=True,STDIN=subprocess.PIPE,STDOUT=subprocess.PIPE) y = subprocess.call("echo $var",STDIN=x.stdout,STDOUT=subprocess.PIPE)

如前所述,从来没有尝试过这样的事情。 在发布之前将其来源。

/ u / unutbu已经回答了这个问题。 不过,我在他的代码中修正了一些错误

def run_external_script(script): if is_windows(): command = script+" && python -c "import os; print dict(os.environ)"" else: command = ". "+ script+" && python -c 'import os; print dict(os.environ)'" output = subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True).communicate()[0] r = re.compile('{.*}') m = r.search(output) try: env = eval(m.group(0)) except: error( "Something went wrong in " + script ) error( output ) return env

有一些小的差异:

这个代码可以在windows / linux上运行

我用subprocess.call替换了subprocess.check_output,check_output需要Python 2.7

当我运行他的代码时,脚本的std也会打印在输出变量中。 所以我用了两个{}之间的字典,例如{'var1'= 1,'var2'='x'}。

而不是使用json,我使用python的eval。 有注射的机会,所以使用它的风险自负。 如{; exit(1); } {; exit(1); }

相关文章

本篇内容主要讲解“gitee如何上传代码”,感兴趣的朋友不妨来...
这篇“从gitee上下的代码如何用”文章的知识点大部分人都不太...
这篇文章主要介绍“gitee如何下载仓库里的项目”,在日常操作...
本篇内容主要讲解“怎么在Gitee上更新代码”,感兴趣的朋友不...
本文小编为大家详细介绍“怎么将工程托管到gitee”,内容详细...
这篇文章主要介绍了gitee中图片大小如何调整的相关知识,内容...