在开发 Python 项目时,我们需要编写一个 setup.py 脚本来指定项目的元数据和打包信息。然而,有时候我们可能会遇到一些问题,导致 setup.py 脚本无法正常运行。
例如,在上述问题中,作者遇到了以下问题:
- 使用 sudo python setup.py alias release register sdist bdist_egg upload 命令后,在 /usr/local/lib/python2.7/dist-packages/ 目录下只能看到 my_project-0.0.1.egg-info/ 文件夹,而没有 my_project 目录,导致项目无法正常安装。
- 使用 sudo python setup.py install 命令后,在 /usr/local/lib/python2.7/dist-packages/ 目录下只能看到 my_project-0.0.1-py2.7.egg 文件夹,同样没有 my_project 目录。
作者想要在 /usr/local/lib/python2.7/dist-packages/ 目录下看到两个目录:
my_project-0.0.1.egg-info/
* my_project
* http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
并且 my_project 目录中应该包含项目的所有 Python 文件。
2、解决方案
该问题的根源在于 setup.py 脚本中的 package_dir 参数设置错误。package_dir 参数指定了项目的包目录,也就是包含项目所有 Python 文件的目录。
在上面的示例中,作者将 package_dir 参数设置为 {‘’:‘my_project’},这意味着项目的所有 Python 文件都应该放在 my_project/my_project 目录下。然而,作者的项目结构中,项目的所有 Python 文件都放在 my_project 目录下,并没有 my_project/my_project 目录。因此,find_packages(‘my_project’) 无法找到任何包,导致项目无法正常安装。
为了解决这个问题,作者只需要将 package_dir 参数设置为 {‘’:‘.’},这样就可以告诉 setuptools 项目的所有 Python 文件都放在当前目录下。
除此之外,作者还可以通过在 setup.py 脚本中添加 print(find_packages(‘my_project’)) 语句来查看 find_packages(‘my_project’) 函数的返回值,以确保其能够正确找到项目的所有包。
以下是修改后的 setup.py 脚本:
from setuptools import setup, find_packages
setup(
name='my_project',
version='0.0.1',
author='AUTHOR',
author_email='CONTACT',
url='http://example.com',
description='Some description',
long_description=open('README.rst').read(),
packages=find_packages('.'),
package_dir={'':'.'},
package_data={'':['*.py']},
include_package_data=True,
scripts=[],
requires=[],
license='BSD License',
install_requires=[
'some_packages',
],
classifiers=[
'Development Status :: 2 - Pre-Alpha',
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Database',
'Topic :: Internet',
'Topic :: Software Development :: Libraries :: Python Modules',
],
keywords='python, setup, script, the best',
)
修改后,作者就可以使用 sudo python setup.py alias release register sdist bdist_egg upload 和 sudo python setup.py install 命令正常安装项目了。