相关疑难解决方法(0)

在运行时为ctypes更改LD_LIBRARY_PATH

如何在运行时更新此环境变量,以便ctypes可以在任何地方加载库?我尝试了以下,似乎都没有工作.

from ctypes import *
os.environ['LD_LIBRARY_PATH'] = "/home/starlon/Projects/pyCFA635/lib"  
os.putenv('LD_LIBRARY_PATH', "/home/starlon/Projects/pyCFA635/lib")  
lib = CDLL("libevaluator.so")
Run Code Online (Sandbox Code Playgroud)

python ctypes

36
推荐指数
3
解决办法
3万
查看次数

更改当前进程环境的LD_LIBRARY_PATH

是否有可能改变当前流程的环境变量?

更具体地说,我想改变python脚本,LD_LIBRARY_PATH以便在导入依赖于某些模块的模块'x'时xyz.so,xyz.so取自LD_LIBRARY_PATH中的给定路径

有没有其他方法动态更改库加载的路径?

编辑:我想我需要提一下,我已经尝试过像os.environ这样的东西["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH',mypath)

但这些修改了env.对于生成的子进程,而不是当前进程,并且模块加载不考虑新的LD_LIBRARY_PATH

Edit2,所以问题是我们可以改变环境或其他东西,以便库加载器看到它并从那里加载吗?

python shared-libraries environment-variables

22
推荐指数
2
解决办法
2万
查看次数

从Python内部设置LD_LIBRARY_PATH

有没有办法在运行时设置指定Python查找共享库?

fontforge.so找到了fontforge_bin并尝试了以下内容

os.environ['LD_LIBRARY_PATH']='fontforge_bin'
sys.path.append('fontforge_bin')
import fontforge
Run Code Online (Sandbox Code Playgroud)

得到

ImportError: fontforge_bin/fontforge.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这样lddfontforge_bin/fontforge.so提供了以下

linux-vdso.so.1 =>  (0x00007fff2050c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f10ffdef000)
libc.so.6 => /lib/libc.so.6 (0x00007f10ffa6c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f110022d000)
Run Code Online (Sandbox Code Playgroud)

python linux fontforge

20
推荐指数
3
解决办法
3万
查看次数

恢复原始argv

当显式调用脚本时python,它会argv被删除,因此这argv[0]是运行脚本的路径.如果被调用为python foo/bar.py甚至如此,就是这种情况python -m foo.bar.

我需要一种方法来恢复原始argv(即收到的原始python).不幸的是,它并不像前面那样容易sys.executable,sys.argv因为python foo/bar.py它不同于python -m foo.bar(隐式的PYTHONPATH不同,这可能是至关重要的,具体取决于你的模块结构).

更具体地说,在python foo/bar.py some other args和的情况下python -m foo.bar some other args,我正在寻找恢复['python', 'foo/bar.py', 'some', 'other', 'args']['python', '-m', 'foo.bar', 'some', 'other', 'args']分别.

我知道之前的问题:

但是这些似乎误解了炮弹是如何运作的,而答案却反映了这一点.我没有兴趣在解开外壳的工作(如评估壳VAR和功能都很好),我只是想在原来的argv给予python.

我发现的唯一解决方案是使用/proc/<PID>/cmdline:

import os
with open("/proc/{}/cmdline".format(os.getpid()), 'rb') as f:
  original_argv …
Run Code Online (Sandbox Code Playgroud)

python command-line-arguments python-3.x

10
推荐指数
2
解决办法
255
查看次数

Cython 无法找到共享对象文件

我正在尝试按照我在网上找到的说明(包括以下答案)从 Cython 链接到我自己的 C 库:

使用 Cython 将 Python 链接到共享库

我正在通过 Spyder 运行 IPython。

我的 setup.py 看起来像这样:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy as np

setup(
  ext_modules = cythonize(
      [Extension("*",["*.pyx"],
                 libraries =["MyLib"],
                 extra_compile_args = ["-fopenmp","-O3"],
                 extra_link_args=["-L/path/to/lib"])
                 ]),
  include_dirs = [np.get_include()],
)
Run Code Online (Sandbox Code Playgroud)

文件libMyLib.so在里面/path/to/lib,它编译得很好。

我的 IPython 配置文件启动文件夹中有一个 Python 脚本可以执行此操作

try:
  os.environ["LD_LIBRARY_PATH"] += ":/path/to/lib"
except KeyError:
  os.environ["LD_LIBRARY_PATH"] = "/path/to/lib"
Run Code Online (Sandbox Code Playgroud)

我可以确认这正在运行,因为如果我输入os.environ["LD_LIBRARY_PATH"]IPython 解释器,它会返回/path/to/lib

但是当我尝试加载 Cython 模块(即import mycythonmodule)时,我得到:

ImportError: …
Run Code Online (Sandbox Code Playgroud)

python linker ipython cython

5
推荐指数
1
解决办法
3229
查看次数

尝试导入pypyodbc模块会出现错误'找不到ODBC库.是否设置了LD_LIBRARY_PATH?'

我在Linux Mint 18上运行Python 3.5.我想加载pypyodbc模块.但是,无论我尝试什么,我总是得到错误:

OdbcNoLibrary: 'ODBC Library is not found. Is LD_LIBRARY_PATH set?'
Run Code Online (Sandbox Code Playgroud)

使用python导入之前设置LD_LIBRARY_PATH我得到了设置路径的建议os.getcwd(),但它也没有工作,并给了我同样的错误.

我应该安装什么才能使它工作?

查看错误的完整日志:

In [1]: import pypyodbc
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/home/me/env/lib/python3.5/site-packages/pypyodbc.py in <module>()
    426         # First try direct loading libodbc.so
--> 427         ODBC_API = ctypes.cdll.LoadLibrary('libodbc.so')
    428     except:

/usr/lib/python3.5/ctypes/__init__.py in LoadLibrary(self, name)
    424     def LoadLibrary(self, name):
--> 425         return self._dlltype(name)
    426 

/usr/lib/python3.5/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    346         if handle is None:
--> 347             self._handle = …
Run Code Online (Sandbox Code Playgroud)

python linux import odbc pypyodbc

5
推荐指数
1
解决办法
4284
查看次数