Tom*_*cik 4 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
Run Code Online (Sandbox Code Playgroud)
当我将 export 添加到 .bashrc 行时:
export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"
Run Code Online (Sandbox Code Playgroud)
并重新加载 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
Run Code Online (Sandbox Code Playgroud)
我尝试在代码中使用:
import os
Run Code Online (Sandbox Code Playgroud)
os.environ["LD_LIBRARY_PATH"] = "/kplusnfs/script/ns/BerkleyDB/lib/"
Run Code Online (Sandbox Code Playgroud)
os.system('export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"')
Run Code Online (Sandbox Code Playgroud)
os.putenv("LD_LIBRARY_PATH", "/kplusnfs/script/ns/BerkleyDB/lib/")
Run Code Online (Sandbox Code Playgroud)
而且每次都不起作用。但是选项 #2 + 下面的代码用于重新加载 bash:
os.system('bash')
Run Code Online (Sandbox Code Playgroud)
确实有帮助。但是脚本运行很荒谬,因为它正在加载 bash 并离开以前的操作......
所以我的问题是 - 有没有可能的方法不仅可以设置变量,还可以在不重新加载 bash 的情况下为我的用户加载库?
附言。我没有 root 权限,所以我无法更改系统内的任何内容(包括安装任何 Python 库)
cda*_*rke 10
您似乎误解了什么是环境变量,以及它们的存储方式。
每个进程(正在运行的程序的一个实例)都有一个称为环境块的内存区域,这是环境变量所在的地方。您使用了“系统环境”一词 - 没有这样的东西。
当 shell 启动时,它会在它的环境块中创建一些环境变量,任何进程都可以这样做。Bash 自己发明了一些并从启动文件中获取其他一些,例如.bashrc(Windows 使用注册表项)。
当 shell 运行另一个程序时,它会在子进程中运行。父进程的各个部分被复制到子进程(称为继承)。这些部分之一是环境块。
子进程可以更改自己的环境块,但这只会更改自己的本地副本,不会影响父进程。更改仅传播到子项的子项,而不会返回到父项。
所以当你这样做时:
os.system('export LD_LIBRARY_PATH="/kplusnfs/script/ns/BerkleyDB/lib"')
Run Code Online (Sandbox Code Playgroud)
运行子进程(shell),在该子进程中设置环境变量,然后退出,这是浪费时间,因为该子进程没有任何内容。
当你这样做时:
os.environ["LD_LIBRARY_PATH"] = "/kplusnfs/script/ns/BerkleyDB/lib/"
Run Code Online (Sandbox Code Playgroud)
在你的python进程中设置一个环境变量,然后kondor_processes.py从同一个python进程(使用subprocess.run)运行你的。如果您不这样做,那么一旦您退出 python,那么所有环境更改都将丢失。
但是,如果这就是您在 python 中要做的所有事情,那么您不妨编写一个 shell 脚本包装器,其中包含一条export语句 to run kondor_processes.py。最好将其放入用户的启动文件(.bashrc或.bash_profile)中。
| 归档时间: |
|
| 查看次数: |
9803 次 |
| 最近记录: |