【问题标题】:Python and environment variablesPython 和环境变量
【发布时间】:2012-06-04 17:10:42
【问题描述】:

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

这是我沮丧的根源:

  • 当下面的脚本在使用模式下运行时,它会打印出 CLASSPATH OK (from $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()

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    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 配置。

    【讨论】:

    • 我在调用脚本时使用 sudo 来模拟 init.d 调用此脚本时发生的情况。那么,如何在 init.d 时应用这个想法呢?
    • 我不确定我是否理解您的问题。我已经建议如何使用env 命令使您现有的脚本工作。我认为这会做你想要的。如果这不符合您的要求,请更新您的问题(而不是将其变成一个巨大的评论线程),以说明您想要的行为与您使用此建议得到的行为有何不同。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2016-05-07
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2015-09-16
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多