【问题标题】:Python module won't installPython 模块不会安装
【发布时间】:2013-01-29 17:35:57
【问题描述】:

这是我的setup.py 文件

#!/usr/bin/env python

from setuptools import setup
from sys import path

setup(name= 'conundrum',
    version= '0.1.0',
    author= 'elssar',
    author_email= 'elssar@altrawcode.com',
    py_modules= ['conundrum'],
    url= 'https://github.com/elssar/conundrum',
    license= 'MIT',
    description= 'A framework agnostic blog generator.',
    long_description= open(path[0]+'/README.md', 'r').read(),
    install_requires= [
        'PyYAML >= 3.0.9',
        'Markdown >= 2.2.0',
        'requests >= 1.0.4',
        ],
)

我尝试过同时使用setuptoolsdistutils,但这不会安装我的模块。相反,我得到了

file module.py (for module module) not found

这是我的目录结构

/module
|--/test
|--README.md
|--license.txt
|--module.py
|--setup.py

明确一点,module是根目录。

谁能告诉我我做错了什么?

这是我尝试安装时的输出

elssar@elssar-laptop:/usr/local/src/conundrum$ sudo python /home/elssar/code/conundrum/setup.py install
/usr/lib/python2.6/distutils/dist.py:250: UserWarning: 'licence' distribution option is deprecated; use 'license'
  warnings.warn(msg)
running install
running bdist_egg
running egg_info
writing requirements to conundrum.egg-info/requires.txt
writing conundrum.egg-info/PKG-INFO
writing top-level names to conundrum.egg-info/top_level.txt
writing dependency_links to conundrum.egg-info/dependency_links.txt
warning: manifest_maker: standard file 'setup.py' not found
file conundrum.py (for module conundrum) not found
reading manifest file 'conundrum.egg-info/SOURCES.txt'
writing manifest file 'conundrum.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
file conundrum.py (for module conundrum) not found
file conundrum.py (for module conundrum) not found
warning: install_lib: 'build/lib.linux-x86_64-2.6' does not exist -- no Python modules to install
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying conundrum.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying conundrum.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying conundrum.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying conundrum.egg-info/requires.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying conundrum.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating 'dist/conundrum-0.1.0-py2.6.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing conundrum-0.1.0-py2.6.egg
removing '/usr/local/lib/python2.6/dist-packages/conundrum-0.1.0-py2.6.egg' (and everything under it)
creating /usr/local/lib/python2.6/dist-packages/conundrum-0.1.0-py2.6.egg
Extracting conundrum-0.1.0-py2.6.egg to /usr/local/lib/python2.6/dist-packages
conundrum 0.1.0 is already the active version in easy-install.pth

Installed /usr/local/lib/python2.6/dist-packages/conundrum-0.1.0-py2.6.egg
Processing dependencies for conundrum==0.1.0
Searching for requests==1.0.4
Best match: requests 1.0.4
Adding requests 1.0.4 to easy-install.pth file

Using /usr/local/lib/python2.6/dist-packages
Searching for Markdown==2.2.0
Best match: Markdown 2.2.0
Processing Markdown-2.2.0-py2.6.egg
Markdown 2.2.0 is already the active version in easy-install.pth
Installing markdown_py script to /usr/local/bin

Using /usr/local/lib/python2.6/dist-packages/Markdown-2.2.0-py2.6.egg
Searching for PyYAML==3.10
Best match: PyYAML 3.10
Adding PyYAML 3.10 to easy-install.pth file

Using /usr/local/lib/python2.6/dist-packages
Finished processing dependencies for conundrum==0.1.0

为了确保我的系统没有问题,我从 github 下载了两个具有类似 setup.py 的软件包并安装了它们。安装没有任何问题。

【问题讨论】:

  • 您使用什么命令进行安装以及遇到什么错误?
  • @Mike 这是我得到的唯一错误。除此之外,还有一些警告。
  • @elssar:警告是什么?错误的回溯是什么?也许你认为这些都不相关,也许你是对的,但你可能是错的——如果你确切地知道这里发生了什么,你就不会问这个问题。所以请给我们你正在运行的实际命令和完整的输出。
  • 另外,请给我们您的实际setup.py,或者一个精简但仍可运行的版本,但仍能证明问题。因为您所显示的内容将因dependencies 行上的NameError 而失败。而且,如果你摆脱它,它会工作得很好。
  • @abarnert 问题已更新

标签: python setuptools distutils


【解决方案1】:

我无法从其他目录运行setup.py。它需要从它所在的目录运行。这就是这里的问题。

固定。

【讨论】:

  • 好的。我只是假设您知道module.py 将是$(pwd)/module.py,而不是$(dirname /path/to/setup.py)/module.py。但这不是一个很好的假设。 Unix 工具以这种方式比其他方式更频繁地这样做,但这与“只能以这种方式”不同(尤其是对于 Windows 用户)。 (顺便说一句,如果您在package_dir 中使用相对路径,情况也是如此——它是相对于密码的。)您认为文档需要更清楚地说明这一点吗?如果是这样,您可能需要提交文档错误,或将其提交到邮件列表中。
  • @abarnert 我知道module.py 在哪里,我只是假设setup.py 会自动从其根目录读取并安装在当前工作目录中。我将不得不再次仔细阅读文档,看看这是否还没有写在某个地方。我认为我的问题有一半是由于我在阅读多个来源的行之间的随意过程,然后查看代码示例以弄清楚发生了什么而不理解它的作用。
  • @elssar:我在文档中找不到任何明确说明的地方;我认为他们只是做出与我相同的假设。但我和你一样,并没有仔细研究它们。
  • 这个解决方案也适用于我的 docker 容器。在 DockerFile 中,而不是“RUN python /package/setup.py install”,我需要“WORKDIR /package”,然后是“RUN python setup.py install”
【解决方案2】:

如果我理解您的布局,问题是您使用的是默认的package_dir,这意味着像module 这样的顶级模块需要在根目录中作为module.py,而不是作为@987654327 @。

所以,添加这个:

package_dir = {'': 'module'}

现在,它将寻找modulemodule/module.py

(PS,如果您的模块或其子目录或理想情况下两者都被称为“模块”以外的其他名称,那么讨论这一切都会变得更容易混淆。此外,如果您使用更标准的格式来绘制目录树。)

这在Listing whole packages 中有解释。 (我意识到您列出的是单个模块,而不是整个包,但该部分的文档只是说“再次,您可以使用 package_dir 选项覆盖包/目录对应关系”,参考我链接的部分。和@ 987654322@ for package_dir 的帮助更小;它只是说“包到目录名称的映射”。)

【讨论】:

  • 它不应该成为第二个答案,但我发现 The Hitchhiker's Guide to Packaging 1.0 - Creating a Package 作为开发包结构的骨架很有帮助。
  • @Mike:IIRC,该指南避免解释所有复杂的东西,而是解释如何避免需要复杂的东西——这意味着它可能不会直接回答 OP 的问题,但很容易让他不再需要答案。 (而且,即使没有,也值得一读。)所以,绝对 +1。
  • @Mike 猜我应该更清楚——> module 是根目录,它与 module.py 同名。更清楚一点 - 根目录名为 module,它包含 python 脚本 module.py 和其他所有内容,以及一个包含测试的子目录,我不需要安装。
  • @Mike 我已阅读该指南,但本教程需要我创建另一个目录和一个 __init__.py 文件,因为我不需要初始化任何内容,所以该文件为空。
  • @elssar 一个空的__init__.py 文件是完全有效的——它向python表明该目录是一个包。
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2017-07-24
  • 2016-04-08
  • 1970-01-01
  • 2012-02-27
相关资源
最近更新 更多