【问题标题】:How to source a file having environment variables如何获取具有环境变量的文件
【发布时间】:2019-10-12 17:04:36
【问题描述】:

我有一个包含环境变量的源文件(很少有环境变量也是基于条件的)。 源文件就像(文件名:global_setup)

if( -f /tools/tool/bin) then
    setenv SHELL /bin/csh
endif

setenv LICENCE_FILE 2457@abc
setenv ...........

我想使用 python 脚本来获取这个文件。代码是这样的:

import subprocess
import os

if os.path.isfile('global_setup'):
    subprocess.call(['/bin/csh', '-c', 'source ~/global_setup'], shell=True)
else:
    print("file not found");

但这不起作用。显示错误为:

/home/global_setup:第 53 行:语法错误:文件意外结束

另外,我尝试通过将文件格式更改为 Unix 来消除此 EOF 错误。 即使它有效,我怀疑设置是否会在其他终端中完成,因为我在 python 中使用 subprocess.call()。

【问题讨论】:

    标签: python python-3.x bash sh csh


    【解决方案1】:

    您应该做以下两件事之一,而不是这样做:

    1. 在调用脚本之前在 linux shell 中获取文件。
    2. 将您的文件转换为 Python 可以使用 Python-dotenv 模块读取的 dotenv 文件。

    在 IMO 之前采购它更容易,而不是在运行时使用子流程采购它。

    【讨论】:

      【解决方案2】:

      使用subprocess.call() 获取文件不会对Python 中的环境变量产生影响,因为subprocess 运行的是一个子进程。

      如果您希望在 Python 解释器中影响 os.environ,则需要自己解析文件。

      由于您的文件是 csh 样式的,否则非常好的 envparse 模块不会在这里使用。

      不过,你可以做的就是调用

      env = subprocess.check_output(['/bin/csh', '-c', 'source ~/global_setup; printenv'], shell=True)
      

      并逐行解析生成的env 变量并将内容添加到os.environ。这样global_setup 中的条件也可以按预期工作。

      【讨论】:

        猜你喜欢
        • 2012-03-24
        • 2018-07-15
        • 1970-01-01
        • 2014-01-20
        • 2016-12-29
        • 2017-03-06
        • 2019-07-10
        • 2017-06-23
        • 1970-01-01
        相关资源
        最近更新 更多