【发布时间】:2016-01-30 15:11:09
【问题描述】:
我正在尝试学习如何通过 PyPI 上的 pip 使 Python 模块可用。为此,我正在使用 PyPI 测试站点 (https://testpypi.python.org/pypi) 进行测试,并尝试为该模块创建一个 setup.py。我的模块是根目录中的一个文件,我无法成功安装它。我想知道如何做到这一点。
下面,我将详细说明我正在采取的步骤。我怀疑问题出在我写setup.py的方式上。
存储库的剖析如下:
.
├── examples_1.py
├── LICENSE
├── MANIFEST.in
├── README.rst
├── setup.py
└── supermodule.py
请注意,模块只是目录根目录下的文件supermodule.py。另请注意,文件examples_1.py不包含在模块包的安装中。
setup.py的内容如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import setuptools
def read(*paths):
with open(os.path.join(*paths), "r") as filename:
return filename.read()
def main():
setuptools.setup(
name = "supermodule",
version = "2015.10.30.0820",
description = "super utilities",
long_description = (read("README.rst")),
url = "https://github.com/johndrake1/junk",
author = "John Drake",
author_email = "j.drake@sern.ch",
license = "GPLv3",
package_data = {
"": [
"*.txt",
"*.md",
"*.rst",
"*.py"
]
}
)
if __name__ == "__main__":
main()
我通过以下程序注册、上传和安装包:
python setup.py register -r https://testpypi.python.org/pypi
python setup.py sdist upload -r https://testpypi.python.org/pypi
sudo pip install -i https://testpypi.python.org/pypi supermodule
在源代码分发中,supermodule-2015.10.30.0820.tar.gz,我可以看到以下目录结构:
.
└── supermodule-2015.10.30.0820
├── LICENSE
├── MANIFEST.in
├── PKG-INFO
├── README.rst
├── setup.cfg
├── setup.py
├── supermodule.egg-info
│ ├── dependency_links.txt
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ └── top_level.txt
└── supermodule.py
因此,打包和上传似乎工作正常,并且包含位于根目录的模块文件supermodule.py。但是,当我安装软件包时,我会在本地安装以下文件:
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/DESCRIPTION.rst
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/METADATA
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/RECORD
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/WHEEL
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/metadata.json
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0820.dist-info/top_level.txt
您可以看到文件supermodule.py 不存在并且无法在Python 实例中导入。我应该怎么做才能将此文件包含在安装中,以便它可以在 Python 中导入?
编辑:根据@DeanFenster 的建议,我将文件supermodule.py 移动到supermodule/__init__.py 并将setup.py 更改为以下内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import setuptools
def read(*paths):
with open(os.path.join(*paths), "r") as filename:
return filename.read()
def main():
setuptools.setup(
name = "supermodule",
version = "2015.10.30.0902",
description = "super utilities",
long_description = (read("README.rst")),
url = "https://github.com/johndrake1/junk",
author = "John Drake",
author_email = "j.drake@sern.ch",
license = "GPLv3",
packages = ["supermodule"]
)
if __name__ == "__main__":
main()
在注册、上传和安装之后,这导致安装使模块可导入,并在本地安装以下文件:
/usr/local/lib/python2.7/dist-packages/supermodule
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info
/usr/local/lib/python2.7/dist-packages/supermodule/__init__.py
/usr/local/lib/python2.7/dist-packages/supermodule/__init__.pyc
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/DESCRIPTION.rst
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/METADATA
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/RECORD
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/WHEEL
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/metadata.json
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.0902.dist-info/top_level.txt
这种方法很好用,但我还是想知道当模块是单个文件的形式时如何安装。
编辑:根据@Xk0nSid 的建议,我将setup.py 更改为以下内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import setuptools
def read(*paths):
with open(os.path.join(*paths), "r") as filename:
return filename.read()
def main():
setuptools.setup(
name = "supermodule",
version = "2015.10.30.1001",
description = "super utilities",
long_description = (read("README.rst")),
url = "https://github.com/johndrake1/junk",
author = "John Drake",
author_email = "j.drake@sern.ch",
license = "GPLv3",
py_modules = ["supermodule"],
entry_points = """
[console_scripts]
supermodule = supermodule:supermodule
"""
)
if __name__ == "__main__":
main()
在注册、上传和安装之后,这导致安装使模块可导入,并在本地安装以下文件:
/usr/local/bin/supermodule
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info
/usr/local/lib/python2.7/dist-packages/supermodule.py
/usr/local/lib/python2.7/dist-packages/supermodule.pyc
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/DESCRIPTION.rst
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/METADATA
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/RECORD
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/WHEEL
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/entry_points.txt
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/metadata.json
/usr/local/lib/python2.7/dist-packages/supermodule-2015.10.30.1001.dist-info/top_level.txt
这种方法成功地处理了模块的单个文件形式。
【问题讨论】:
-
模块是否存在于
site_packages目录下? -
@DeanFenster 嘿,感谢您的评论。不,安装后该模块在目录
/usr/local/lib/python2.7/dist-packages中不存在。我的问题中列出的目录是supermodule似乎存在的唯一目录。 -
试着把你的脚本放在一个包里怎么样? (带有项目名称和
__init__文件中代码的文件夹) -
@DeanFenster 感谢您的建议。我刚刚尝试了您的方法,并添加了该方法的详细信息来编辑问题。使用这种方法,包可以成功安装并且可以在 Python 中导入。所以,很高兴知道这是有效的。我仍然想知道如何安装单个文件形式的模块。
标签: python module setup.py pypi