gpt4 book ai didi

python - ruamel.yaml 安装在自定义文件夹中时出现 ImportError

转载 作者:行者123 更新时间:2023-11-28 19:03:42 25 4
gpt4 key购买 nike

我面临着与此处提出的问题类似的情况:Python Import error on installing ruamel.yaml in custom directory

我知道我们会想要使用某种形式的 python 环境隔离机制,如 virtualenv 来创建我们的 python 代码可以在其中运行的隔离环境。然而,在我所在的行业中,我们编写几个 python 包需要在其他带有自己的 python 解释器的现成软件中使用的情况并不少见,因此我们受到限制软件(例如 autodesk maya)使用的 python 版本,我们没有使用 virtualenv 的灵 active 。

pip install --install-option="--prefix=\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14" <package_name>

我们使用类似于上述命令的方式将写入的这些代码部署到自定义的第 3 方目录中。我们将环境设置为包含站 pip 包和第 3 方部署文件夹的脚本。

PYTHONPATH=\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14\Lib\site-packages;%PYTHONPATH%

PATH=\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14\Scripts;%PATH%;

在这种情况下,该软件与 python 2.7.14 解释器捆绑在一起,我们编写了一个需要 ruamel.yaml 的包

尝试在第 3 方软件的 python 解释器中导入 ruamel.yaml 时出现以下错误。

ImportError: No module named ruamel.yaml

即使我从我的标准 python 2.7.14 解释器中导入 ruamel,我也会得到相同的 ImportError。

λ python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ruamel.yaml
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named ruamel.yaml
>>> import sys
>>> sys.path
['', '\\\\vm-fs-001\\prod\\sww\\proj\\general\\python\\python-2.7.14\\Lib\\site-packages', 'C:\\windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', '\\\\vm-dc-001\\RedirectedFolders$\\nelson.lim\\AppData\\Roaming\\Python\\Python27\\site-packages', 'C:\\Python27\\lib\\site-packages']
>>>

但是,如果我在此处添加 __init__.py:\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14\Lib\site-packages\ruamel\__init__.py 并使 ruamel 文件夹成为包而不是命名空间文件夹,导入错误将消失。

导入带有安装在自定义文件夹中的命名空间的包似乎存在问题。

我该如何解决这个问题?

最佳答案

Namespaces are a honking great idea ,但不幸的是,命名空间包的实现存在一些问题,ruamel.yaml 安装程序必须解决这些问题。虽然我没有对 ruamel.yaml 安装程序中的 .pth 文件做任何事情,但 --prefix-ed 安装没有似乎以与非前缀安装相同的方式处理它们。

ruamel.yaml 安装程序是数据驱动的,setup.py 在许多包之间是通用的。在没有任何功能改进的情况下重写和测试所有这些将花费大量时间,并且到目前为止没有人愿意为此付出代价(而且可能更好地花在改进命名空间包机制上)。

除了完全重新打包 ruamel.yaml 之外,如果 ruamel/__init__.py 在您之前加载自己的包时不存在,您应该能够创建它您执行 from ruamel.yaml import YAML(假设您的包依赖于 ruamel.yaml)。如果 ruamel.yaml 是可选安装,或者作为一般解决方法,我建议您创建一个包 ruamel_yaml 来创建该文件(即 PREFIX/ruamel/__init__ .py),如果该文件不存在,则在其 __init__.py 中执行 from ruamel.yaml import *

当您使用以下方式进行前缀安装时,这种方法至少适用于基于 Linux 的安装:

pip install --prefix=/path/to/some/directory ruamel_yaml-0.1-py2.py3-none-any.whl

创建这样一个包的setup.py:

from setuptools import setup

import os
from textwrap import dedent

pkg = 'ruamel_yaml'
os.makedirs(pkg)
with open(pkg + '/__init__.py', 'w') as fp:
fp.write(dedent("""\
import sys
import os

fn = __file__.replace('ruamel_yaml', 'ruamel').replace('__init__.pyc', '__init__.py')
if not os.path.exists(fn):
with open(fn, 'w'):
pass

from ruamel.yaml import *
"""))

with open('setup.cfg', 'w') as fp:
fp.write('[bdist_wheel]\nuniversal = 1\n')


setup(name=pkg,
version='0.1',
description='wrapper for --prefix installations of ruamel.yaml',
author='Your Name',
url='http://someurl.com',
author_email='your@email',
license='MIT',
install_requires=['ruamel.yaml'],
packages=[pkg],
zip_safe=False)

使用以下方法创建 ruamel_yaml-0.1-py2.py3-none-any.whl

pip install wheel
python setup.py bdist_wheel

如有必要,生成的 __init__.py 还应该执行“使 ruamel 文件夹成为一个包而不是命名空间文件夹”的步骤(我不清楚这意味着什么),如果这在 Windows/for Maya 上是必需的。

关于python - ruamel.yaml 安装在自定义文件夹中时出现 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com