看起来非常简单...直到我要尝试7-9次才能首次使用它。我使用python3.7,Mac OS。

可以说我在文件夹prediction_model下,是以下文件的目录树。

-- setup.py
--- prediction_model
    |-- Readme.md
    |-- __init__.py
    |-- data
    |   |-- VDFF.csv
    |   +-- SAAA.csv
    |-- models.py
    |-- preprocess.py
    |-- tests
    +-- _data.csv


我的setup.py

from setuptools import setup, find_packages

setup(name='prediction_model',
      version='0.7',
      description='I need official documentation that works',
      author='JL',
      author_email='JL_from_uni',
      packages=find_packages(), #what does this do to make the developers' life easier, seriously?
      scripts = ['models.py', 'preprocess.py'],
      zip_safe=False)


__init__.py看起来像这样:

from prediction_model import preprocess
from prediction_model import models


preprocess.py具有一个称为run()的功能,而models.py具有我要起诉的main()

我实际上已经尝试使用以下所有版本的setup.py版本:
python -m pip install --user .

如果我在python控制台上调用,还返回AttributeError:

import prediction_model(不会返回错误)

prediction_model.src.main()

AttributeError: module 'prediction_model' has no attribute 'src'

prediction_model.main()

AttributeError: module 'prediction_model' has no attribute 'main'

prediction_model.run()

AttributeError: module 'prediction_model' has no attribute 'run'

我不敢相信那里的所有文档都有不同的解释。显然没有任何作用,那么,有更多经验的人认为什么会起作用?

最佳答案

设定

最佳实践是使用src布局(请参见https://blog.ionelmc.ro/2014/05/25/python-packaging/),因此我建议您按以下方式组织目录(因为您不应该打包测试和自述文件以进行内部发行,因此它们应放在src目录之外) :

project
├─ src
|  └─ package
|     ├─ __init__.py
|     ├─ __main__.py
|     ├─ data.tsv
|     └─ module.py
├─ tests
|  └─ test_module.py
├─ MANIFEST.in
├─ README.rst
└─ setup.py


具有以下setup.py文件内容:

import setuptools

setuptools.setup(
    name="project name",
    version="project version",
    url="project URI",
    author="your name",
    author_email="your email",
    package_dir={"": "src"},
    packages=setuptools.find_namespace_packages(where="src"),
    include_package_data=True
)


以及以下MANIFEST.in文件内容:

graft src
graft tests
global-exclude *.py[cod]


备注。 —如果在保留package目录的同时不希望在src目录中使用顶级src目录(例如在帖子编辑之前):

project
├─ src
|  ├─ __init__.py
|  ├─ __main__.py
|  ├─ data.tsv
|  └─ module.py
├─ tests
|  └─ test_module.py
├─ MANIFEST.in
├─ README.rst
└─ setup.py


然后将package映射到src参数中的package_dir目录,并在setup.py文件中的package函数的packages参数中显式列出setuptools.setup(参见https://docs.python.org/3/distutils/examples.html#pure-python-distribution-by-package):

import setuptools

setuptools.setup(
    name="project name",
    version="project version",
    url="project URI",
    author="your name",
    author_email="your email",
    package_dir={"package": "src"},
    packages=["package"],
    include_package_data=True
)




现在,您可以使用以下命令将项目打包到源代码分发中:

$ python setup.py sdist


或带有此命令的内置发行版(这是setuptools的扩展命令,要求在您的Python环境中安装wheel-因此请先运行pip install wheel):

$ python setup.py bdist_wheel


或同时使用以下命令:

$ python setup.py sdist bdist_wheel


在新的dist目录中创建以下文件:


{project name}-{project version}.tar.gz用于源代码分发;
{project name}-{project version}-{compatibility tags}.whl用于构建发行版。


安装

现在,您可以使用以下命令从源代码分发安装项目:

$ pip install dist/{project name}-{project version}.tar.gz


或使用以下命令从构建的发行版中:

$ pip install dist/{project name}-{project version}-{compatibility tags}.whl


或使用此命令从项目树(无需为此项目打包项目):

$ pip install .




最终,您可以像这样导入项目:

import package.module

package.module.function()

关于python - Python3包装中的AttributeError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58995910/

10-16 03:13
查看更多