Linux Shell中的python export env变量

时间:2018-08-16 23:09:48

标签: 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?

Ps。我没有root特权,因此无法更改系统内的任何内容(包括安装任何Python库)

1 个答案:

答案 0 :(得分:1)

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

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

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

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

子进程可以更改其自身的环境块,但是仅更改其自身的本地副本,不会影响父进程。更改只会传播给孩子的孩子,而不会传播给父母。

因此,当您这样做时:

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)中。