在$ PYTHONPATH或sys.path中获取包的包版本的建议方法是什么?我记得pkg_resource模块有一些功能,但我找不到任何相关信息.请不要指向我使用version.py文件并以某种方式阅读它的解决方案.使用pkg_resources是可行的方法但究竟如何?
问题是试图获得如何做到这一点的确切指示.之前几乎没有尝试,似乎不是完整的解决方案:
手头的任务是阅读有关程序运行的蛋的信息.我理解的方法很少:
硬编码鸡蛋的位置并将其视为zip存档 - 将起作用,但不够灵活,因为如果将文件移动到另一个位置,则需要对其进行编辑和重新编译
使用ResourceManager().resource_filename(__name__, filename)
- 这似乎是有限的,因为我无法访问鸡蛋内部的文件,但不能访问包内.文件名中的"../../EGG-INFO/PKG-INFO"等符号不起作用,给出KeyError.所以也没有好处.
使用dist = pkg_resources.get_distribution("dist_name")
然后使用dist对象来获取信息,但我无法从文档中了解如何指定我的分发名称?它找不到它.
因此,我正在寻找关于使用pkg_resources.get_distribution
plus的正确解决方案,最终有一个完整的解决方案来读取鸡蛋内部的任何文件会很高兴.
谢谢!
我正在尝试在Ubuntu中使用virtualenv来安装本地虚拟Python环境.当我运行shell命令时:
$ virtualenv ./virt_python
Run Code Online (Sandbox Code Playgroud)
它抛出一个无法导入的异常pkg_resources
.但是当我打开一个Python shell并且from pkg_resources import load_entry_point
运行正常时.作为参考,完整的堆栈跟踪如下.
$ virtualenv ./virt_python
New python executable in ./virt_python/bin/python
Installing setuptools............done.
Installing pip.......
Complete output from command /home/rpsharp/local/...hon/bin/easy_install /usr/local/lib/pytho...pport/pip-1.1.tar.gz:
Traceback (most recent call last):
File "/home/rpsharp/local/workspace/invest-natcap.invest-3/virt_python/bin/easy_install", line 5, in <module>
from pkg_resources import load_entry_point
ImportError: No module named pkg_resources
----------------------------------------
...Installing pip...done.
Traceback (most recent call last):
File "/usr/local/bin/virtualenv", line 9, in <module>
load_entry_point('virtualenv==1.7.1.2', 'console_scripts', 'virtualenv')()
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 928, in main
never_download=options.never_download)
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 1042, in …
Run Code Online (Sandbox Code Playgroud) 我正在尝试加载我的项目中使用的资源,pkg_resources
但它只是抛出一个异常,说它引用"无法为没有'get_data()'的加载器执行此操作".我不确定我在这里做错了什么,或者是否pkg_resources
在python 3.3上以某种方式被破坏了.我准确地使用python 3.3.3.这是我试图执行的代码
>>> import pkg_resources
>>> data = pkg_resources.resource_stream('configgenerator', 'schema_rules.yml')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/users/frank/workspace/configgenerator/env/lib/python3.3/site-packages/distribute-0.6.31-py3.3.egg/pkg_resources.py", line 931, in resource_stream
self, resource_name
File "/home/users/frank/workspace/configgenerator/env/lib/python3.3/site-packages/distribute-0.6.31-py3.3.egg/pkg_resources.py", line 1207, in get_resource_stream
return StringIO(self.get_resource_string(manager, resource_name))
File "/home/users/frank/workspace/configgenerator/env/lib/python3.3/site-packages/distribute-0.6.31-py3.3.egg/pkg_resources.py", line 1210, in get_resource_string
return self._get(self._fn(self.module_path, resource_name))
File "/home/users/frank/workspace/configgenerator/env/lib/python3.3/site-packages/distribute-0.6.31-py3.3.egg/pkg_resources.py", line 1289, in _get
"Can't perform this operation for loaders without 'get_data()'"
NotImplementedError: Can't perform this operation for loaders without 'get_data()'
>>>
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何解决这个问题?
我有一个Python应用程序,通过查找插件pkg_resources.iter_entry_points
.
当直接从源结账运行时,这将找到sys.path
适合账单的任何内容,包括恰好适用.egg-info
于setuptools
查找的源检出.
然而,当我通过任何地方安装软件包时python setup.py install
,它突然停止检测所列举的所有内容sys.path
,而只是查找与其一起安装的内容site-packages
.
pkg_resources.iter_entry_points
vanilla source checkout v.已安装的应用程序的行为有所不同? sys.path
,就像在开发中一样?我正在处理P
带有 setuptools 和 pkg_resources 的包,该包在安装后需要下载一些二进制文件并将它们放在专用目录 ( P/bin/
) 中。
我正在尝试使用pkg_ressources.resource_filename
来获取绝对目录路径。(为了与 virtualenv 一起工作)
在使用 安装期间python setup.py install
, pkg_ressources.resource_filename 不会返回类似 的路径/home/user/tests/venv/lib/python3.4/site-package/P/bin/
,而是返回实际模块的路径,例如/home/user/projects/P/P/bin/
。
这是一个问题,因为我需要安装目录(在 virtualenv 内),而不是我的个人项目目录(我开发模块的地方)。
如果我尝试通过 pypi,使用pip install module
,返回的目录pkg_ressources.resource_filename
是一个临时文件,例如/tmp/pip-build-xxxxxxx/P/bin/
,这又不是应该放置二进制文件的地方。
这是我的 setup.py:
from setuptools import setup
import os
from setuptools.command.install import install as _install
from pkg_resources import resource_filename
def post_install():
"""Get the binaries online, and give them the execution permission"""
package_dir_bin = resource_filename('P', 'bin') # should be /home/user/tests/venv/lib/python3.4/site-package/P/bin/ …
Run Code Online (Sandbox Code Playgroud) 我不明白 pkg_resource.resource_filename() 到底是如何工作的以及它的参数是什么。我在网上搜索了很多,但他们的官方文档并没有很好地涵盖它。有人可以解释一下吗?
我正在尝试提供 package_docs 目录中的静态文件。当我在浏览器中打开时:
http://127.0.0.1:8001/packages/docs/index.html,页面正在运行。
但是我想打开页面:http : //127.0.0.1 : 8001/packages/docs/
没有源文件。输出是 404 Not Found
app.mount("/packages/docs",
StaticFiles(directory=pkg_resources.resource_filename(__name__, 'package_docs')
),
name="package_docs")
@app.get("/packages/docs/.*", include_in_schema=False)
def root():
return HTMLResponse(pkg_resources.resource_string(__name__, "package_docs/index.html"))
app.include_router(static.router)
app.include_router(jamcam.router, prefix="/api/v1/cams", tags=["jamcam"])
Run Code Online (Sandbox Code Playgroud)
如何更改我的代码?任何建议都会有所帮助。先感谢您。
我们为所有系统安装了一个常见的python,以确保每个系统都具有相同的python安装并简化配置问题.此安装位于共享驱动器上.我们还有多个共享此安装的平台.我们通过在编译python时设置--exec-prefix configure选项来解决冲突的特定于平台的文件.
我的问题是我现在想要使用依赖于平台的easy_install(或其他)来安装一个鸡蛋.easy_install将egg放在安装的独立于平台的部分的site-packages目录中.鸡蛋的名称中有平台,所以不应该有冲突.但是python只会加载它找到的第一个.(因此,在Solaris上它可能会尝试加载Linux egg).修改easy-install.pth文件可以改变它找到的文件,但这是无用的.
我可以将.egg文件移动到平台依赖的包目录中,然后使用pkg_resources.require()加载它们(或手动调整路径).但似乎我不应该这样做,因为平台是以鸡蛋的名义.
有没有更通用的方法我可以确保python将加载鸡蛋为正确的平台?
我在 Windows 8.1 上使用 Python 3.3.5 和 cx-freeze 4.3.3。
我正在尝试 cx_freeze 一个使用 pkg_resources 的程序。
我最初将它放在包下的安装文件中,但是当我尝试冻结它时,进程因错误而停止Import Error: No module named 'pkg_resources'
。
然后我将它在安装文件中从包移动到包含。这次 cx_freeze 进程完成了,但是当我尝试启动应用程序时,我收到了另一条错误消息。
如果我去我的 IDE 并尝试导入 pkg_resources 它工作正常。
>>> import pkg_resources
>>> pkg_resources
<module 'pkg_resources' from 'C:\\Python33\\lib\\site-packages\\setuptools-18.0.1-py3.3.egg\\pkg_resources\\__init__.py'>
Run Code Online (Sandbox Code Playgroud)
这里问了一个类似的问题,解决方法是重新安装setuptools。所以我下载了 setuptools 18.0.1 并通过 cmd 安装了它,但它没有解决我的问题,我仍然遇到与 cx_freeze 相同的错误。
任何帮助使其正常工作将不胜感激。
编辑:我的解决方案(hack)是从 yagmail 中编写依赖项。Yagmail 的原始 _innit__.py...
from pkg_resources import get_distribution
__project__ = 'yagmail'
__version__ = get_distribution(__project__).version
Run Code Online (Sandbox Code Playgroud)
我首先在那里放了一个打印语句来获取版本,然后对其进行硬编码。
__project__ = 'yagmail'
__version__ = '0.4.84'
Run Code Online (Sandbox Code Playgroud)
虽然这解决了我的问题,但它并不是真正的答案,所以如果有人有一个保留 pkg_resources.
pkg-resources ×10
python ×9
python-3.x ×3
setuptools ×2
cx-freeze ×1
easy-install ×1
fastapi ×1
packaging ×1
python-wheel ×1
routes ×1
static-files ×1
virtualenv ×1