Linux-sh中python-export-env变量

2024-09-26 04:52:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试将路径导出到系统环境,然后会发生什么: 路径是BerkleyDB library的(需要搁置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

当我将export添加到.bashrc行时:

^{pr2}$

然后重新加载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/"

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

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

每次都没用。但下面的选项2+用于重新加载bash:

os.system('bash')

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

所以我的问题是-有没有可能不重新加载bash就不仅为我的用户设置变量,还可以加载库?在

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


Tags: inpyosliblinescriptplusaug
1条回答
网友
1楼 · 发布于 2024-09-26 04:52:11

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

每个进程(正在运行的程序的实例)都有一个内存区域,称为环境块,这是环境变量所在的地方。你用了“系统环境”这个词——根本没有。在

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

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

子进程可以更改其自己的环境块,但这只会更改自己的本地副本,而不会影响父进程。更改只传播到子级的子级,而不会传回父级。在

所以当你这么做的时候:

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

它运行一个子进程(shell),在该子进程中设置一个环境变量,然后退出,这是浪费时间的,因为该子进程中没有持久的内容。在

当您这样做时:

^{pr2}$

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

但是,如果这就是python中要做的全部工作,那么最好编写一个shell脚本包装器,其中包含一个export语句来运行kondor_processes.py。最好将其放入用户的启动文件(.bashrc.bash_profile)。在

相关问题 更多 >