微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐