【问题标题】:Why can't I import my self-created Python package?为什么我无法导入我自己创建的 Python 包?
【发布时间】:2016-04-16 02:01:11
【问题描述】:

我刚刚创建了一个 Python 包 (sources here),但我在安装后无法使用它。一个简单的导入给我一个ImportError

下面我将准确地展示我所做的,以便您可以重现它:

$ git clone git@github.com:kramer65/peewee-versioned.git
Cloning into 'peewee-versioned' 
etc. etc.
Checking connectivity... done.
$ virtualenv venv
New python executable in the/path/to/my/venv/bin/python
Installing setuptools, pip, wheel...done.
$ . venv/bin/activate
(venv) $ cd peewee-versioned/
(venv) $ python setup.py install
running install
etc. etc. everything installs without errors
Finished processing dependencies for peewee-versioned==0.1
(venv) $ cd ..
(venv) $ pip freeze
peewee==2.8.0
peewee-versioned==0.1  # AS YOU CAN SEE IT IS INSTALLED
six==1.10.0
(venv) $ python
Python 2.7.10 (default, Oct 23 2015, 18:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import peewee
>>> import peewee_versioned
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named peewee_versioned

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

from setuptools import setup, find_packages

setup(
    name='peewee-versioned',
    version='0.1',
    packages=find_packages(exclude=['test', 'test.*']),
    include_package_data=True,
    platforms='any',
    install_requires=[
        'peewee',
        'six'
    ],
)

项目中唯一相关的文件是versioned.py(见full sources here

有人知道我在这里做错了什么吗?欢迎所有提示!

[编辑]

我查看了venv site-packages中是否有与我的包相关的egg,有(查看第5个包):

$ ls -l venv/lib/python2.7/site-packages/
total 512
-rw-r--r--   1 kramer65  staff     276 13 apr 13:53 easy-install.pth
-rw-r--r--   1 kramer65  staff     126 13 apr 13:53 easy_install.py
-rw-r--r--   1 kramer65  staff     367 13 apr 13:53 easy_install.pyc
-rw-r--r--   1 kramer65  staff  242923 13 apr 13:53 peewee-2.8.0-py2.7.egg
-rw-r--r--   1 kramer65  staff     970 13 apr 13:53 peewee_versioned-0.1-py2.7.egg
drwxr-xr-x  34 kramer65  staff    1156 13 apr 13:53 pip
drwxr-xr-x  10 kramer65  staff     340 13 apr 13:53 pip-8.1.1.dist-info
drwxr-xr-x   6 kramer65  staff     204 13 apr 13:53 pkg_resources
drwxr-xr-x  52 kramer65  staff    1768 13 apr 13:53 setuptools
drwxr-xr-x  12 kramer65  staff     408 13 apr 13:53 setuptools-20.7.0.dist-info
drwxr-xr-x   5 kramer65  staff     170 13 apr 13:53 six-1.10.0-py2.7.egg
drwxr-xr-x  32 kramer65  staff    1088 13 apr 13:53 wheel
drwxr-xr-x  11 kramer65  staff     374 13 apr 13:53 wheel-0.29.0.dist-info

那为什么我不能导入呢?

【问题讨论】:

  • 您可能还想展示您的setup.py 以及您的python 项目的结构。
  • @cel - 你是对的。我刚刚在源代码的末尾添加了 setup.py 和一个链接。有什么想法吗?
  • import peewee_versioned 无法工作,因为您尚未安装具有该名称的模块。您的模块名称是versioned,所以import versioned 可能有效。
  • import peewee-versioned 也许?
  • @cel - 不幸的是import versioned 也给出了ImportError。我尝试将 versioned.py 重命名为 peewee_versioned.py 并再次安装,但结果相同。还有其他想法吗?

标签: python module package setuptools setup.py


【解决方案1】:

由于您在存储库中没有任何包并且只有一个名为versioned.py 的文件,因此您应该能够在运行python setup.py install 后将其导入为import versioned。为我工作:

$ mkvirtualenv peewee
New python executable in peewee/bin/python
...
$ git clone https://github.com/kramer65/peewee-versioned
Cloning into 'peewee-versioned'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 20 (delta 5), reused 18 (delta 5), pack-reused 0
Unpacking objects: 100% (20/20), done.
Checking connectivity... done.
$ cd peewee-versioned/
$ python setup.py install
running install
...
Finished processing dependencies for peewee-versioned==0.1
$ pip freeze
peewee==2.8.0
peewee-versioned==0.1
six==1.10.0
wheel==0.24.0
$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import versioned
>>>

无论如何,既然您希望它从peewee_versioned 导入,我会在这里做两件事:

  • versioned.py 重命名为peewee_versioned.py
  • 按照Listing individual modules 文档段落,使用py_modules

    py_modules = ['peewee_versioned']
    

【讨论】:

    【解决方案2】:

    我认为您必须单独包含版本化模块,因为您没有包。我不认为 find_package 方法会找到单独的模块。

    尝试将 py_modules = ['versioned'] 添加到设置中:

    setup(
        name='peewee-versioned',
        version='0.1.1',
        packages=find_packages(exclude=['test', 'test.*']),
        include_package_data=True,
        platforms='any',
        install_requires=[
            'peewee',
            'six'
        ],
        py_modules = ['versioned']
    )
    

    在此之后,您应该可以导入版本。

    【讨论】:

      【解决方案3】:

      如果你只想要名字,你可以使用“import as”功能:

      import versioned as peewee_versioned
      

      【讨论】:

        【解决方案4】:

        正确的做法是让你的目录结构如下:

        peewee-versioned/
          peewee_versioned/
            __init__.py
            peewee_versioned.py
          setup.py
        

        其中__init__.pyimport peewee_versioned(或from peewee_versioned import *)行,具体取决于您的用例。

        通过正确构建文件,您可以保护自己免受未来可能有多个文件的更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-12
          • 2018-12-03
          • 1970-01-01
          • 2021-11-10
          • 2016-05-31
          相关资源
          最近更新 更多