【问题标题】:How should I set this up for a working package?我应该如何为工作包设置这个?
【发布时间】:2022-01-21 23:52:55
【问题描述】:

我在 python 方面才刚刚起步,并试图弄清楚如何打包我的一些工具以进行分发,并且很难理解文档。

阅读文档后,我的包结构如下所示:

/UTM (git repo)
    /utmizer
        /raster
            raster.py
        __init__.py
        convert.py
        LICENSE
        README.md
        setup.py
        utmize.py

__init__.py 看起来像这样,因为我不确定自己在做什么:

import utmizer.utmize as utmize
from utmizer.raster import raster
from .convert import Converter

我的导入语句如下所示:

convert.py

import fiona
import geopandas as gpd
import json
import os
import re

from raster import raster

utmize.py

from utmizer.convert import Converter
import getopt
import os
from pathlib import Path
import sys

最后,setup.py 看起来像这样:

from pathlib import Path
import setuptools
from setuptools import find_packages


VERSION = '0.0.1'
HERE = Path(__file__).parent.resolve()


long_description = (HERE / 'README.md').read_text(encoding='utf-8')


setuptools.setup(
    name='utmizer',
    version=VERSION,
    author='username',
    author_email='my@email.com',
    description='Automatic projection of data to appropriate UTM zone',
    long_description=long_description,
    long_description_content_type='text/markdown',
    url='https://github.com/username/UTM',
    install_requires=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3"
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.8, <4',
)

当我运行python setup.py bdist_wheel 时,它完成了;但是当我将它安装在一个新的 conda 实例中并尝试 import utmizer 时,它会抛出一个 ModuleNotFoundError

【问题讨论】:

    标签: setuptools setup.py python-packaging


    【解决方案1】:

    第一件事:

    • setup.py LICENSEREADME.md 移动到项目的根目录(git 存储库),在实际的顶级可导入包之外。
    • utmizer/raster 中添加包初始化程序__init__.py,以及任何其他可导入的包和子包。

    所以你应该得到一个这样的目录树:

    /UTM (git repo)
        setup.py
        LICENSE
        README.md
        /utmizer
            /raster
                __init__.py
                raster.py
            __init__.py
            convert.py
            utmize.py
    

    好像你在setup.py 中混淆了packagesinstall_requires。不确定您在install_requires 中究竟需要什么,但我猜至少geopandasfiona

    也不需要限制为 Python &lt;4,因为没有人知道它是否确实不兼容。作为一项规则,您应该只对您在撰写本文时确定不兼容的事物添加限制(没有人可以猜测未来)。

    from pathlib import Path
    import setuptools
    
    VERSION = '0.0.1'
    HERE = Path(__file__).parent.resolve()
    
    long_description = (HERE / 'README.md').read_text(encoding='utf-8')
    
    setuptools.setup(
        name='utmizer',
        version=VERSION,
        author='username',
        author_email='my@email.com',
        description='Automatic projection of data to appropriate UTM zone',
        long_description=long_description,
        long_description_content_type='text/markdown',
        url='https://github.com/username/UTM',
        packages=setuptools.find_packages(),
        install_requires=[
            'fiona',
            'geopandas',
        ],
        classifiers=[
            "Programming Language :: Python :: 3"
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
        ],
        python_requires='>=3.8',
    )
    

    您可能可以将__init__.py 文件留空。

    一般来说,您应该始终使用从顶级可导入包(或模块)开始的绝对导入。在您的情况下,只有一个顶级可导入包utmizer(并且没有顶级可导入模块)。

    所以在utmizer/convert.py:

    import fiona
    import geopandas as gpd
    import json
    import os
    import re
    
    from utmizer.raster import raster
    

    utmizer/utmize.py 似乎已经正确。

    【讨论】:

    • @auslander 我没有对此进行测试,只是在我的头顶上写下了。如果您有机会对此进行测试并且有问题,请告诉我,我会尽力解决。
    • 今天我会试一试,然后报告!感谢您提供令人难以置信的彻底回答,我会收藏它并经常参考它。
    • 很抱歉造成延迟,但想让您知道它有效,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2011-09-30
    • 2012-08-03
    相关资源
    最近更新 更多