在python脚本中设置环境变量,并运行相关应用
1. 问题
在自动化应用的时候 ,有时候环境变量与运行需要不一致。这时候有两种选择:
- 改变节点环境变量,使得其和运行需求保持一致;
- 在自动化脚本中设置环境变量,其范围只在脚本运行环境中有效。
显然,当需要运行多个自动化脚本,每个的需求不一致的时候,选择2是更好的设计。
2. 解决方案和案例
假设我们有两个java的运行版本,一个是本节点上的java,版本7;另一个是云盘上共享的版本8。我们需要运行elasticsearch 6.2.3,它需要java8。而我们不希望更新节点上的java:
- java 8路径:/shared/java8/bin
- elasticsearch 6.2.3路径:/opt/elasticsearch6.2.3/bin
- elasticsearch用户:elasticsearch
import subprocess, re, os, socket, resource, pwd, crypt, logging, sys, platform def demote(user_uid, user_gid):
def result():
os.setgid(user_gid)
os.setuid(user_uid)
return result class setuputil:
@staticmethod
def run_command(args, username=None, usercwd=None):
try:
if username:
pw_record = pwd.getpwnam(username)
env = os.environ.copy()
env['HOME'] = pw_record.pw_dir
env['LOGNAME'] = username
env['USER'] = username
if usercwd:
env['PWD'] = usercwd
p = subprocess.Popen(args, preexec_fn=demote(pw_record.pw_uid, pw_record.pw_gid),
cwd=usercwd, env=env, close_fds=True)
else:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds = True) outputs = p.communicate()
for out in outputs:
if out:
return (p.returncode, out)
except OSError as os_e:
return (os_e.errno, os_e.strerror)
except ValueError as val_e:
return (val_e.errno, val_e.strerror)
else:
return (p.returncode, outputs) @staticmethod
def java_version():
java_ver_pattern = '\"(\d+\.\d+).*\"'
java_cmd = "java"
if 'JAVA_HOME' in os.environ:
java_cmd = os.environ['JAVA_HOME'] + "/bin/java"
version = subprocess.check_output([java_cmd, '-version'], stderr=subprocess.STDOUT)
if version:
return re.search(java_ver_pattern, version).groups()[0]
else:
return None @staticmethod
def start_app(es_exec, pid_file, es_user):
rtcode, msg = setuputil.run_command([es_exec, '-d', '-p', pid_file], es_user)
if rtcode:
return (rtcode, msg)
else:
return (0, "OK") MIN_JAVA_VERSION = 1.8
ELASTIC_USER = 'elastic'
ELASTIC_PASSWORD = 'elastic'
ELASTIC_PID = '/tmp/elasticpid' def main():
# set up java home
os.environ['JAVA_HOME'] = '/shared/java8' j_ver = setuputil.java_version()
if not j_ver or float(j_ver) < MIN_JAVA_VERSION:
logging.error("Java isn't installed or java version is not up to date: %s", j_ver if j_ver else "None")
return (1, "Java isn't installed or java version is not up to date: %s"%(j_ver if j_ver else "None")) rtcode, msg = setuputil.start_app('/opt/elasticsearch6.2.3/bin/elasticsearch', ELASTIC_PID, ELASTIC_USER)
if rtcode:
logging.error("Failed to start elasticsearch: %d, %s", rtcode, msg)
return (rtcode, msg)
else:
logging.debug("Start elasticsearch: %s", msg)
return (0, None) if __name__ == '__main__':
main()
3. 注意的问题
有几个需要注意的问题:
- 环境变量的适用范围(scope)
- 一般只在运行的当前shell有效
- 就上例而言,JAVA_HOME只在运行脚本的进程里是有效
- 在哪里设置环境变量?
- 需要在运行命令之前设置
- 就上例而言,JAVA_HOME需要在运行java版本检查,和运行elasticsearch之前设置
在python脚本中设置环境变量,并运行相关应用的更多相关文章
- python 程序中设置环境变量
python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 ...
- ant脚本中设置环境变量
http://blog.csdn.net/quqi99/article/details/5329841
- 怎样在Ubuntu中设置环境变量
首先启动终端. 单击屏幕左上角的Ubuntu图标,在弹出的窗口中点击搜索栏,输入"terminal", 稍等片刻,终端就会赫然在目!二话不说,直接点击! 然后打开环境设置文 ...
- Python IDLE arcpy设置环境变量
在IDLE中 import arcpy help(arcpy) 得到的路径为: 但是在arcmap中,路径为: 说明IDLE的环境变量设置有问题: 在windows的环境变量中设置环境变量PYTHON ...
- Ubuntu中设置环境变量详解
1, 为单一用户:.bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.打开用户主目录下的.bashrc,在这个文件中加入export PA ...
- dockerfile中设置环境变量
设置环境变量要用 ENV ENV JAVA_HOME /usr/local/jdk1.8.0_171 ENV PATH $JAVA_HOME/bin:$PATH 用 echo "JAVA_H ...
- Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决
问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...
- 如何在pycharm中设置环境变量
今天运行tensorflow的时候,发现在pycharm下,程序无法找到CUDA的libcupti.so文件.而在添加完环境变量: export LD_LIBRARY_PATH=$LD_LIBRARY ...
- MySQL在Windows中设置环境变量
在桌面选择“计算机”的图标(或者是我的电脑),右键-->属性-->点击“高级系统设置” 然后选择 高级 选项点击环境变量 然后点击新建-> 变量名为MYSQL_HOME 变量值为m ...
随机推荐
- PHP常用功能块_错误和异常处理 — php(32)
一.错误和异常处理 1.1 错误类型和基本的调试方法PHP程序的错误发生一般归属于下列三个领域: 语法错误:语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行时错 ...
- ethers.js-5-Utilities
https://docs.ethers.io/ethers.js/html/api-utils.html 使用时再进行查看即可
- 用C#给程序加启动画面并只允许一个应用程序实例运行
. 启动画面类: public class SplashForm : System.Windows.Forms.Form { private System.Windows.Forms.PictureB ...
- hive中文字符乱码 解决方法【转】
一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为 j ...
- LeetCode559. Maximum Depth of N-ary Tree
第一次写出了具有迭代和递归的函数,还是有点收获的,虽然题目比较简答 当要对某些对象重复使用时,考虑循环,也就是迭代 当函数可以简化一个重复的操作时,考虑递归,而且就当下一次使用这和函数的结果已经有啦, ...
- 使用VS Code发布博客
使用VS Code 发布文章 这也是学习别人怎么去使用VS Code 发布文章 上传图片 这是我上传的图片 通过插件的方式上传 ctrl+alt+aQQ截图 使用插件 Markdown All in ...
- MySQL数据库初始
MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句 一 ...
- CentOS 7 在最小化安装之后进行安装Apache服务,httpd-2.4.34
此博文是CentOS 7 在最小化安装之后进行安装Apache服务的操作步骤,httpd版本为httpd-2.4.34. 一.基本服务环境搭建 安装apache需要的基本环境:apr apr-util ...
- 阿里云linux服务器打开端口号
之前linux回滚了下,然后就连不上xshell和filezille了,后台安全配置哪里也都打开了端口号了,还是不行.然后我就想重启下ssh服务 ,执行service sshd restart 提示1 ...
- JavaWeb基础—Servlet
一.Servlet是什么 是服务器上运行的Java小应用程序,并被称为JavaWeb三大组件之一 通常我们把实现了Servlet的类,称之为Servlet Servlet作用主要是 1.接收请求数据 ...