Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在自定义文件夹中安装ruamel.yaml时导入错误_Python_Python 2.7_Pip_Ruamel.yaml - Fatal编程技术网

Python 在自定义文件夹中安装ruamel.yaml时导入错误

Python 在自定义文件夹中安装ruamel.yaml时导入错误,python,python-2.7,pip,ruamel.yaml,Python,Python 2.7,Pip,Ruamel.yaml,我面临的情况与这里提出的问题类似: 我知道,我们希望使用某种形式的python环境隔离机制(如virtualenv)来创建隔离的环境,我们的python代码可以在其中运行。然而,在我所处的行业中,我们编写了一些python软件包,这些软件包需要在其他自带python解释器的现成软件中使用,这并不少见,因此我们受到该软件的python版本(例如autodesk maya)的限制使用,我们没有使用virtualenv的灵活性 pip install --install-option="--prefi

我面临的情况与这里提出的问题类似:

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

pip install --install-option="--prefix=\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14" <package_name>
在本例中,软件与python 2.7.14解释器捆绑在一起,我们编写了一个需要ruamel.yaml的包

在第三方软件的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']
>>>
λpython
win32上的Python 2.7.14(v2.7.14:84471935ed,2017年9月16日,20:25:58)[MSC v.1500 64位(AMD64)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口ruamel.yaml
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为ruamel.yaml的模块
>>>导入系统
>>>系统路径
['',\\\\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\\plat win',C:\\python27\\Lib\\Lib-tk',C:\\python27',重定向文件夹$\\\nelson.lim\\AppData\\python27\\site packages,'C:\\Python27\\lib\\site包']
>>>
但是,如果我在这里添加一个
\uuu init\uuuuuuuuuuupy
\\vm-fs-001\prod\sww\proj\general\python\python-2.7.14\Lib\site packages\ruamel\\uuuuuuuu init\uuuuuuuuuuuuuuuuupy
,并使ruamel文件夹成为一个包而不是名称空间文件夹,导入错误就会消失

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

如何解决此问题?

,但不幸的是,命名空间包的实现存在一些问题,
ruamel.yaml
安装程序必须解决这些问题。尽管我没有对
ruamel.yaml
a
--prefix
-ed安装程序中的
.pth
文件做任何处理,但ed安装的处理方式似乎与非前缀安装不同

ruamel.yaml
安装程序是数据驱动的,
setup.py
在许多软件包中都很常见。重写和测试所有这些都需要花费大量时间,而没有任何功能上的改进,到目前为止,没有人愿意为此付出代价(而且可能最好花在改进名称空间包机制上)

除了完全重新打包
ruamel.yaml
,如果在从ruamel.yaml导入yaml之前加载您自己的包时,
ruamel/\uuu init\uuuuuuuuuuuuuuuupy
不存在,您应该能够创建
ruamel/.yaml//code>(假设您的包依赖于
ruamel.yaml
)。如果
ruamel.yaml
是可选安装,或者作为一般解决方法,我建议您创建一个包
ruamel\u yaml
,创建该文件(即
PREFIX/ruamel/\uu init\uuuuuuuuuu.py
),如果该文件不存在,则从ruamel.yaml导入*

当您使用以下方法进行前缀安装时,这种方法至少适用于基于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

如果需要,生成的
\uuuu init\uuuuuuuuuuupy
还应该实现“使ruamel文件夹成为包而不是名称空间文件夹”(我不清楚这需要什么)的步骤,如果Windows/for Maya需要的话。

问题在于
ruamel.yaml
本身,它有一个糟糕的安装程序。作者用.pth文件编写了可怕的骇人听闻的黑客程序,试图让名称空间包在Python2上工作。您不是第一个出现问题的人,也不会是最后一个,因为编写sane安装程序的合理请求已被关闭。Anthon,您是否认真地删除了
ruamel.yaml
?为什么?它有很多有用的信息从康达家伙和其他人如何解决这个安装程序的问题!如果可能,请将其还原,以便您的库用户可以看到讨论(以及您最终决定的原因)。首先感谢@Anthon提供的答案和ruamel.yaml。回答你的问题。我使用了--install选项标志而不是--prefix标志,因为我不知道pip现在支持--prefix标志。另外,
\uuuuu init\uuuuuu.py
中没有任何特殊内容,它是一个空文件。我认为通过在ruamel文件夹下添加一个
\uuuu init\uuuu.py
,它不再是一个名称空间,而是一个包。当您打算在我们从ruamel.yaml import yaml执行
之前创建ruamel/\uuu init\uuuuuuuuuuy.py时,您是想在import语句之前以编程方式创建它还是手动创建它?@nelson我会以编程方式创建它,因为您不会忘记您(或其他人)是否使用Maya设置了一台新机器。不要担心它是否仍然是一个名称空间包。添加该文件后,您可以从ruamel.yaml导入yaml执行
,这一点很重要。如果答案中的软件包能够一次性安装就更好了,但这需要一个自我修改的init.py(用于
ruamel\u yaml
)或一个更复杂的
setup.py
(当然,我更喜欢后者,因为您永远不需要
import ruamel\u yaml
)@Nelson,如果您想测试添加
\uu init\uuu.py的
ruamel\u yaml
版本pip install wheel python setup.py bdist_wheel