Ste*_*oat 78 python install distutils build
这是我删除的非代码内容的精简版setup.py脚本:
#!/usr/bin/env python
from distutils.core import setup
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
Run Code Online (Sandbox Code Playgroud)
MANIFEST.in:
include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png
Run Code Online (Sandbox Code Playgroud)
当我运行"python setup.py install sdist"时,我得到一个很好的.tar.gz,带有"whyteboard-0.41"根文件夹,里面有我的locale/images /和whyteboard-help/folders.这也有我的whyteboard.py脚本,它从whyteboard源包中启动我的程序.
所以:
whyteboard/
??? locale/
??? images
??? whyteboard-help/
??? whyteboard/
? ??? __init__.py
? ??? other packages etc
??? whyteboard.py
??? README
??? setup.py
??? CHANGELOG
Run Code Online (Sandbox Code Playgroud)
这反映了我的程序的来源,一切应该是怎样的,并且是正确的.
但是,当我运行"python setup.py install"时,我的数据文件都没有写入 - 只有"whyteboard"源包,而whyteboard.py放在/usr/local/lib/python2.6/dist-packages/中.
理想情况下,我希望在.tar.gz文件中生成的目录结构与在dist-packages中创建的目录结构相同,因为这是我的程序期望查找其资源的方式.
如何通过"安装"来创建此目录结构?据我所知,似乎忽略了我的清单文件.
Car*_*yer 26
除了Ned的答案(其中涉及核心问题)之外的一些注释:
Distutils不会在site-packages(或dist-packagesDebian/Ubuntu)中的每个项目子目录中安装Python包和模块:site-packages正如您所见,它们直接安装在其中.因此,whyteboard-xxsdist中的包含目录将不会存在于最终安装的表单中.
这样做的一个含义是,您应该小心地data_files以一种澄清它们属于哪个项目的方式命名,因为这些文件/目录直接安装在全局site-packages目录中,而不是安装在任何包含whyteboard目录中.
或者你可以反而让你的数据package_data中的whyteboard包(这意味着它需要住那个包里面,也就是旁边__init__.py),然后这不是一个问题.
最后,同时包含whyteboard.py模块py_modules和whyteboard/__init__.py包中没有多大意义packages.这两者是互斥的,如果你同时使用这两个whyteboard.py模块,那么导入将忽略模块,而使用相同名称的包.
如果whyteboard.py只是一个脚本,并且不打算导入,那么您应该使用脚本选项,并从中删除它py_modules.
Gre*_*reg 23
MANIFEST.in当我跑步时,我无法弄清楚为什么我的文件被忽略了python setup.py install- 结果include_package_data=True解决了这个问题.package_data实际上并不需要该选项.
在Mac OSX上运行python 2.6.1,除了在setup.py中使用data_files参数外,我绝对没有运气.使用MANIFEST.in的所有内容只会导致文件包含在dist包中,但从未安装过.我检查了一些其他软件包,他们确实使用data_files来指定其他文件.
我创建了一个简短的函数来帮助枚举目录树中的所有文件
data_files期望的(target_dir,[file list])格式:
def gen_data_files(*dirs):
results = []
for src_dir in dirs:
for root,dirs,files in os.walk(src_dir):
results.append((root, map(lambda f:root + "/" + f, files)))
return results
Run Code Online (Sandbox Code Playgroud)
现在我可以在我的设置调用中调用它:
setup(... data_files = gen_data_files("docs", "lib") ...
Run Code Online (Sandbox Code Playgroud)
这些树中的所有东西都安装好了.
你应该使用setuptools:
#!/usr/bin/env python
from setuptools import setup, find_packages
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = find_packages(),
include_package_data=True,
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
Run Code Online (Sandbox Code Playgroud)
这实际上并不是使用MANIFEST文件来完成这项工作,但它包含了所有需要的文件.
最小已发布的可运行示例
关键要点:只MANIFEST.in对我有用,package_data没有。
在 Ubuntu 19.10、Python 3.7.5、wheel==0.32.3、setuptools==41.1.0、twine==3.1.1 上测试。
最终用户如何使用来自https://pypi.org/project/python-sample-package-with-data/的包:
python3 -m pip install --user python-sample-package-with-data
python-sample-package-with-data
Run Code Online (Sandbox Code Playgroud)
预期输出:
hello data
Run Code Online (Sandbox Code Playgroud)
维护者如何发布它:
# One time setup.
python3 -m pip install --user setuptools wheel twine
# Every time you want to publish.
python setup.py sdist bdist_wheel
twine upload dist/*
rm -rf build dist *.egg-info
Run Code Online (Sandbox Code Playgroud)
实际文件:
清单文件
# Or else pip install cannot find README.md on the setup.py under certain conditions.
include README.md
# This actually adds the data file.
include python_sample_package_with_data/mydata.txt
Run Code Online (Sandbox Code Playgroud)
python-sample-package-with-data
#!/usr/bin/env python3
import python_sample_package_with_data
print(python_sample_package_with_data.get_data(), end='')
Run Code Online (Sandbox Code Playgroud)
python_sample_package_with_data/__init__.py
try:
import importlib.resources as importlib_resources
except ImportError:
# In PY<3.7 fall-back to backported `importlib_resources`.
import importlib_resources
def get_data():
return importlib_resources.read_text(__name__, 'mydata.txt')
Run Code Online (Sandbox Code Playgroud)
python_sample_package_with_data/mydata.txt
hello data
Run Code Online (Sandbox Code Playgroud)
设置文件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from setuptools import setup, find_packages
from os import path
this_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md')) as f:
long_description = f.read()
setup(
name='python-sample-package-with-data',
version='0.0.3',
description='My short description',
long_description=long_description,
long_description_content_type='text/markdown',
url='https://github.com/cirosantilli/python-sample-package-with-data',
author='Ciro Santilli',
author_email='ciro.santilli.contact@gmail.com',
packages=find_packages(),
include_package_data=True,
scripts=['python-sample-package-with-data'],
)
Run Code Online (Sandbox Code Playgroud)
参考书目:
| 归档时间: |
|
| 查看次数: |
26956 次 |
| 最近记录: |