我应该如何为工作包设置它?

How should I set this up for a working package?

我在 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.

第一件事:

  • setup.py LICENSEREADME.md 移动到项目的根目录(git 存储库),在实际的 top-level 可导入包之外。
  • utmizer/raster 中添加包初始值设定项 __init__.py,以及任何其他可导入包和 sub-package。

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

/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<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 文件留空。

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

所以在 utmizer/convert.py:

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

from utmizer.raster import raster

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