看起来非常简单...直到我要尝试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/