Linux shell 中的 python 导出环境变量

标签 python linux bash shelve

我尝试将路径导出到系统环境,然后发生了什么: 路径用于 BerkleyDB 库(需要搁置 Python 库,没有它我会出错:

File "/kplusnfs/script/ns/processes/current/kondor_processes.py", line 214, in load_processes_list_for_hostname
    data_file = shelve.open((os.path.join(config.path_to_script, config.shelve_database)))
  File "/usr/local/lib/python2.6/shelve.py", line 234, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/local/lib/python2.6/shelve.py", line 218, in __init__
    Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
  File "/usr/local/lib/python2.6/anydbm.py", line 82, in open
    mod = __import__(result)
  File "/usr/local/lib/python2.6/dbhash.py", line 8, in <module>
    import bsddb
  File "/usr/local/lib/python2.6/bsddb/__init__.py", line 64, in <module>
    import _bsddb
ImportError: ld.so.1: python: fatal: libdb-4.7.so: open failed: No such file or directory

当我将导出添加到 .bashrc 行时:

export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"

然后重新加载 bash,然后加载库。

库路径包含文件:

ll /kplusnfs/script/ns/BerkleyDB/lib
total 12936
-rwxrwxrwx   1 c310176  atwuser  1470380 Aug  2 03:19 libdb-4.7.a
-rwxrwxrwx   1 c310176  atwuser     1078 Aug  2 03:19 libdb-4.7.la
-rwxrwxrwx   1 c310176  atwuser  1211376 Aug  2 03:19 libdb-4.7.so
-rwxrwxrwx   1 c310176  atwuser  1211376 Aug  2 03:19 libdb-4.so
-rwxrwxrwx   1 c310176  atwuser  1470380 Aug  2 03:19 libdb.a
-rwxrwxrwx   1 c310176  atwuser  1211376 Aug  2 03:19 libdb.so

我尝试在代码中使用:

0

import os

1

os.environ["LD_LIBRARY_PATH"] = "/kplusnfs/script/ns/BerkleyDB/lib/"

2

os.system('export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"')

3

os.putenv("LD_LIBRARY_PATH", "/kplusnfs/script/ns/BerkleyDB/lib/")

而且每次都不起作用。但是选项 #2 + 下面的代码用于重新加载 bash:

os.system('bash')

确实有帮助。但是脚本的运行是荒谬的,因为它正在加载 bash 并离开以前的操作......

所以我的问题是 - 是否有可能在不重新加载 bash 的情况下为我的用户设置变量和加载库?

附言。我没有 root 权限,所以我无法更改系统内的任何内容(包括安装任何 Python 库)

最佳答案

你似乎误解了什么是环境变量,以及它们是如何存储的。

每个进程(正在运行的程序的一个实例)都有一个称为环境 block 的内存区域,这是环境变量所在的地方。您使用了短语“系统环境”- 没有这样的东西。

当 shell 启动时,它会在其环境 block 中创建一些环境变量,任何进程都可以这样做。 Bash 自己发明了一些,并从诸如 .bashrc 之类的启动文件中获取了其他的(Windows 使用注册表项)。

当 shell 运行另一个程序时,它在子进程中运行。父进程的各个部分被复制到子进程(称为继承)。这些部分之一是环境 block 。

子进程可以更改自己的环境 block ,但这只会更改自己的本地副本,不会影响父进程。更改只会传播到子项的子项,永远不会返回到父项。

所以当你这样做的时候:

os.system('export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"')

它运行一个子进程(一个 shell),在该子进程中设置一个环境变量,然后退出,这是浪费时间,因为该子进程不会保留任何内容。

当你这样做时:

os.environ["LD_LIBRARY_PATH"] = "/kplusnfs/script/ns/BerkleyDB/lib/"

在你的 python 进程中设置一个环境变量,然后从同一个 python 进程运行你的 kondor_processes.py(使用 subprocess.run)。如果不这样做,那么一旦退出 python,所有环境更改都会丢失。

但是,如果这就是您要在 Python 中执行的所有操作,那么您不妨编写一个带有 export 语句的 shell 脚本包装器来运行 kondor_processes.py。最好将其放入用户的启动文件(.bashrc.bash_profile)。

关于Linux shell 中的 python 导出环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51886448/

相关文章:

python - BeautifulSoup 无法读取 html

linux - 在 bash 中查找非常大的文本文件中的重复条目

linux - 什么都没有改变时的rsync inode差异

linux - 如何在nagios中配置https_check URL

bash - 如何从日期中减去5分钟

bash - 为什么这个 tar 命令在 ssh 调用中作为字符串传递时会失败?

python - 从 Python Pyramid 项目导出到 Excel .xlsx

python - 调用 destroy() 后 GTK 窗口不会消失

python - 计算 torch 张量的协方差(2d 特征图)

c - execv和execve的区别