- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望以可移植的方式使用 sysv_ipc
库。
我安装了它:
pip3 安装 sysv_ipc
然后从Python:
import sysv_ipc
sysv_ipc.__file__
# Output:
# /home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
如果我将该文件复制到一个文件夹,pip uninstall
该库,然后从该文件夹打开 python 并尝试相同的导入,则会失败。
我尝试检查还安装了哪些内容,结果发现:
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info
/home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/INSTALLER
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/LICENSE
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/METADATA
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/RECORD
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/REQUESTED
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/WHEEL
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/top_level.txt
我在里面没有找到线索setup.py要么。
我想弄清楚的是 -
pip 如何/在哪里与要从该特定文件导入 sysv_ipc
的 Python 相关?
最佳答案
Pip 在 Python 如何处理扩展模块导入方面不起任何作用。 Python 所需要的只是扩展模块文件本身,前提是它采用当前操作系统支持的格式,并且该文件位于 sys.path
上的目录中。搜索路径。
Pip 只负责确保组成项目分发的文件最终位于 sys.path
中。地 pip 。 .dist-info
您找到的目录是包元数据的一部分,由 pip 和 importlib.metadata
使用用于卸载、依赖性跟踪和报告等操作。导入时不会使用这些文件。
您还没有确切地分享您如何尝试导入扩展模块或如何失败,因此我无法评论您出了什么问题。
但是当一切正常时,从动态加载的共享对象库导入模块的工作方式与导入常规模块非常相似:
sys.path
上的所有目录使用 PathFinder object 列出与导入名称匹配的文件和目录。它知道根据文件扩展名查找扩展模块(支持的文件扩展名取决于您的操作系统,请参阅 importlib.machinery.EXTENSION_SUFFIXES
获取列表)。importlib.machinery.ExtensionFileLoader
class用于加载库。加载的意思是:使用依赖于操作系统的动态加载函数加载文件中的代码,然后访问入口 pip 函数(通常是 PyInit_<modulename>
)来获取模块命名空间。请参阅documentation on creating extension modules 。对于 .so
文件 Python/dynload_shlib.c
file实现加载程序,但还有其他dynload_
同一目录中的实现。加载 .so
file Python 将文件路径(至少包含一个 /
斜线)传递给 dlopen()
function .
至于您的情况可能出了什么问题:您使用了与安装项目时使用的不同的 Python 解释器。请注意,扩展模块文件名在模块名称后面包含一个字符串,用于标识 Python ABI ( Application Binary Interface ):
sysv_ipc.cpython-39-x86_64-linux-gnu.so
######## ^^^^^^^^^^^^^^^^^^^^^^^^^^^
module ABI identifier
该标识符使得可以将多个 Python 版本的扩展文件安装到同一目录中。请通过查看 importlib.machinery.EXTENSION_SUFFIXES
检查您的特定 Python 二进制文件接受哪些扩展。 :
$ python3 -c "from importlib.machinery import EXTENSION_SUFFIXES;print(EXTENSION_SUFFIXES)"
['.cpython-39-x86_64-linux-gnu.so', '.abi3.so', '.so']
输出告诉我这个解释器只会查找 sysv_ipc.cpython-39-x86_64-linux-gnu.so
, sysv_ipc.abi3.so
,和sysv_ipc.so
要加载的文件名。
给定的 Python 版本支持扩展模块可能想要使用的特定导出 C 函数,并且 ABI 会告诉您它是针对哪个版本进行编译的。使用短 abi3.so
的扩展后缀是根据 stable ABI 编译的,Python 功能的一个较小子集,保证存在于许多 Python 版本中。
虽然您可以重命名扩展文件以仅使用最短后缀( [module_name].so
),但它在很大程度上取决于动态加载的机器代码调用的 Python 功能(如果它仍然有效)不同的 Python 版本。
这是一个快速演示,显示您只需导入 sysv_ipc
任意目录中的动态库,前提是我使用正确的 Python 版本:
$ virtualenv /demo
... creating a virtualenv ...
done.
$ cd /demo
demo/ $ source bin/activate
(demo) /demo/ $ pip install sysv_ipc
Collecting sysv_ipc
... installing ...
Successfully installed sysv-ipc-1.1.0
(demo) /demo/ $ mkdir newdir
(demo) /demo/ $ cp lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so newdir
(demo) /demo/ $ pip uninstall -y sysv_ipc
Found existing installation: sysv-ipc 1.1.0
... uninstalling ...
Successfully uninstalled sysv-ipc-1.1.0
(demo) /demo/ $ cd newdir/
(demo) /demo/newdir/ $ python
Python 3.9.2 (default, Mar 15 2021, 17:53:50)
[Clang 7.0.1 (tags/RELEASE_701/final)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysv_ipc
>>> sysv_ipc.__file__
'/demo/newdir/sysv_ipc.cpython-39-x86_64-linux-gnu.so'
关于python-3.x - pip 如何告诉 Python 如何导入 C 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67346644/
我是 magento 的新手,目前我在 magento 安装期间遇到“必须加载 PHP 扩展 curl ”错误。你能帮帮我吗? 最佳答案 如果您的服务器上没有安装 curl,您可以键入以下命令之一来安
我在 macOS Mojave/macOS Big Sur/macOS Monterey/macOS Ventura 上使用最新的 php 版本 7.2 并收到类似错误 $composer requ
这个问题已经有答案了: Why generic type is not applicable for argument extends super class for both? (5 个回答) 已关
我正在使用 NightWatch.js 并进行一些 UI 测试,我想用一些额外的 desiredCapabilities 启动默认浏览器实例(即启用扩展并应用一些特定值)。 p> 注意:我可以执行这些
有人知道为什么我在 java 8 中使用此代码时没有服务器扩展名称吗: try { URL url = new URL(urlString); URLC
扩展提供给我的类(class)。为现有的类提供新功能。或扩展现有的mixin s 或虚拟类,任何东西都可以工作。 也许是这样的: class FlatButton {} // maybe no
我有一个关于使用 c 代码和 mod_wsgi 扩展 python 的问题。 我在 apache 服务器中有一个 django 应用程序,它查询 postgresql 数据库以生成报告。在某些报告中,
testcafe支持在Chrome浏览器中加载crx扩展吗? 如果是这样,请告诉我需要尝试什么方法。 我尝试了下面的代码,但没有成功 await t.eval(new Function(fs.read
这个问题已经有答案了: What is a raw type and why shouldn't we use it? (16 个回答) 已关闭 3 年前。 有什么区别: // 1 class A c
我正在编写一个 chrome 扩展来记录单击开始按钮后触发的请求。 这是我的文件:1. list .json { "manifest_version": 2, "name": "recorde
我每天都在使用 vim 和 perforce 现在我的问题是,如果我想查看 perforce 文件修订版,则从命令模式下的 vim :!p4 打印文件#1 vim 试图让我获得缓冲区 #1。有没有办法
大家好,我有一个关于 NUnit 扩展(2.5.10)的问题。 我想做的是向 数据库。为此,我使用 Event 创建了 NUnit 扩展 听众。 我遇到的问题是公共(public)无效 TestFin
我有弹出窗口,而不是模态窗口。 如何通过单击页面的其他部分(不在窗口中)来关闭此窗口? 最佳答案 像这样的东西: function closeWin(e, t) { var el = win.
我通常非常谨慎地使用扩展方法。当我确实觉得有必要编写一个扩展方法时,有时我想重载该方法。我的问题是,您对调用其他扩展方法的扩展方法有何看法?不好的做法?感觉不对,但我无法真正定义原因。 例如,第二个
扩展 Ant Ant带有一组预定义的任务,但是你可以创建自己的任务,如下面的例子所示。 定制Ant 任务应扩展 org.apache.tools.ant.Task 类,同时也应该拓展 execut
我想要一个重定向所有请求的扩展: http://website.com/foo.js 到: http://localhost/myfoo.js 我无法使用主机文件将主机从 website.com 编辑
对于为什么 QChartView 放在 QTabWidget 中时会扩展,我有点迷惑。 这是 QChartView 未展开(因为它被隐藏)时应用程序的图片。 应用程序的黑色部分是 QOpenGLWid
如果在连接条件中使用 OR 运算符,如何优化以下查询以避免 SQL 调优方面的 OR 扩展? SELECT t1.A, t2.B, t1.C, t1.D, t2.E FROM t1 LEFT J
一旦加载插件的问题得到解决(在 .NET 中通过 MEF 的情况下),下一步要解决的是与它们的通信。简单的方法是实现一个接口(interface),使用插件实现,但有时插件只需要扩展应用程序的工作方式
在我的 Symfony2 包中,我需要检查是否定义了一个函数(一个扩展)。更具体地说,如果安装了 KnpMenuBundle,我会在我的包中使用那个,否则我将自己渲染插件。 我试过了,但这当然不起作用
我是一名优秀的程序员,十分优秀!