Python和环境变量

时间:2012-06-04 17:10:43

标签: python subprocess

在下面的代码片段中(意味着在init.d环境中工作)我想执行test.ClassPath。但是,我在设置和传递用户的.bashrc中定义的CLASSPATH环境变量时遇到了问题。

这是我沮丧的根源:

  • 当以下脚本在使用模式下运行时,它会打印出CLASSPATH OK(来自$ HOME / .bashrc)
  • 当我以root身份运行它时,它也显示CLASSPATH正常(我用CLASSPATH设置了/etc/bash.bashrc)
  • 但是当我执行“sudo script.py”(模拟init.d启动时发生的事情)时,CLASSPATH丢失!!

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()

2 个答案:

答案 0 :(得分:4)

默认情况下,

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
    
  3. 选项(2)的明显优势在于它不需要使用sudoers配置进行混乱。

答案 1 :(得分:1)

您可以在启动python脚本之前放置source ~/.bashrc以设置环境变量。