Python and environment variables

2019-10-16 18:54发布

在下面的代码片段(意味着在init.d下的环境中工作),我想执行test.ClassPath。 但是,我有麻烦的设定和通过CLASSPATH环境变量作为用户的.bashrc中定义。

这是我沮丧的来源:

  • 当下面的脚本在使用模式下运行,它打印出的CLASSPATH OK(由$ HOME / .bashrc中)
  • 当我运行它的根,它也显示CLASSPATH罚款(我已经设置了CLASSPATH /etc/bash.bashrc)
  • 但是当我做“命令script.py”(模拟在init.d中启动时会发生什么),classpath缺少!

类路径是相当大的,所以我想从文件中读取它..比如$ HOME /的.classpath

#!/usr/bin/python
import subprocess
import os.path as osp
import os

user = "USERNAME"
logDir = "/home/USERNAME/temp/"
print os.environ["HOME"]

if "CLASSPATH" in os.environ:
        print os.environ["CLASSPATH"]
else:
        print "Missing CLASSPATH"
procLog = open(osp.join(logDir, 'test.log'), 'w')
cmdStr = 'sudo -u %s -i java  test.ClassPath'%(user, ) # run in user
proc = subprocess.Popen(cmdStr, shell=True, bufsize=0, stderr=procLog, stdout=procLog)
procLog.close()

Answer 1:

你可以把source ~/.bashrc开始你的Python脚本获得设置环境变量之前。



Answer 2:

sudo默认不会通过环境变量。 从手册页:

   By default, the env_reset option is enabled.  This causes
   commands to be executed with a minimal environment containing
   TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER and USERNAME in
   addition to variables from the invoking process permitted by
   the env_check and env_keep options.  This is effectively a
   whitelist for environment variables.

有解决这个问题的一些方法。

  1. 您可以编辑/etc/sudoers明确传递CLASSPATH使用可变env_keep配置指令。 这可能看起来是这样的:

     Defaults env_keep += "CLASSPATH" 
  2. 您可以使用运行命令的env命令,它可以让你明确地设置了环境。 一个典型的命令行调用可能是这样的:

     sudo env CLASSPATH=/path1:/path2 java test.ClassPath 

最明显的优势选项(2)是它不需要与瞎sudoers配置。



文章来源: Python and environment variables