如何使用pip和PyPI安装Python模块单个文件?

d3p*_*3pd 4 python module pypi setup.py

我正在尝试学习如何通过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
Run Code Online (Sandbox Code Playgroud)

请注意,该模块只是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()
Run Code Online (Sandbox Code Playgroud)

我通过以下程序注册,上传和安装包:

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
Run Code Online (Sandbox Code Playgroud)

在源代码分发中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
Run Code Online (Sandbox Code Playgroud)

因此,打包和上传似乎工作正常,并包含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
Run Code Online (Sandbox Code Playgroud)

您可以看到该文件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()
Run Code Online (Sandbox Code Playgroud)

在注册,上载和安装之后,这导致了一个使模块可导入的安装,并在本地安装了以下文件:

/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
Run Code Online (Sandbox Code Playgroud)

这种方法很有用,但我仍然想知道如何以单个文件的形式安装模块.


编辑:根据@ 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()
Run Code Online (Sandbox Code Playgroud)

在注册,上载和安装之后,这导致了一个使模块可导入的安装,并在本地安装了以下文件:

/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
Run Code Online (Sandbox Code Playgroud)

这种方法成功地处理了模块的单个文件形式.

Xk0*_*Sid 13

尝试将这样的东西用于单个文件.以下是目录结构:

.
??? example.py
??? LICENSE
??? README.md
??? setup.py

0 directories, 4 files
Run Code Online (Sandbox Code Playgroud)

setup.py

from setuptools import setup

setup(
    name='example',
    version='0.1.0',
    py_modules=['example'],
    install_requires=[
        'exampledep',
    ],
    entry_points='''
        [console_scripts]
        example=example:example
    ''',
)
Run Code Online (Sandbox Code Playgroud)

以上对我有用.这就是示例文件的样子.

def example():
    # Note: You can use sys.argv here
    print "Hi! I'm a command written in python."
Run Code Online (Sandbox Code Playgroud)

这也可以像这样导入:

import example
example.example()
# or
from example import example
example()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

安装需要

install_requires被用来定义dependencies为你的模块/应用.例如,在这种情况下,example模块依赖于exampledep.所以当有人这样做时pip install example,pip也将exampledep按照依赖项中的列出进行安装.

入口点

这通常是可调用的,包的最终用户可能想要使用它.这通常是可调用的,用于命令行.您可以查看 问题或文档以获取更多详细信息.

  • 谢谢,这一行对我帮助很大 py_modules=['example'] (2认同)