如何为这个应用结构编写setup.py?

6 投票
1 回答
2275 浏览
提问于 2025-04-17 16:07

我用Python(2.7)写了一个应用程序,结构大概是这样的:

kent$  tree myApp
myApp
|-- foo.py
|-- gui
|   |-- g1.py
|   |-- g2.py
|   |-- g3.py
|   `-- __init__.py
|-- icons
|   |-- a.png
|   `-- e.png
|-- logic
|   |-- __init__.py
|   |-- l1
|   |   |-- __init__.py
|   |   |-- la.py
|   |   `-- lc.py
|   |-- l2
|   |   |-- __init__.py
|   |   |-- ld.py
|   |   `-- lf.py
|   |-- logic1.py
|   |-- logic2.py
|   `-- logic3.py
|-- myApp.py
`-- resources
    |-- x.data
    `-- z.data

现在我准备写一个 setup.py 文件来发布我的应用程序。我对这个还不太熟悉。看了一些文档和做了一些测试后,出现了一些问题:

  1. 我该如何(或者应该)把我的根包(myApp)打包到 /lib/python/site-package 下呢?

    因为在我的Python文件中,我是通过相对路径来引用资源和图标的。例如,在 foo.py 中可能会有 icons/a.png,而在 gui/g1.py 中可能会有 ../icons/e.png,等等。

  2. 我该如何打包 iconsresources 目录呢?

    看起来 package_datadata_files 似乎不能把这两个目录复制到正确的位置。

  3. 这样做对吗?

    packages = [''],
    package_dir = {'': ''},
    package_data= {'': ['icons/*.*', 'resources/*.*']},
    

    安装后,我的文件会是:

    /usr/lib/python2.7/site-packages/icons/*.png
    /usr/lib/python2.7/site-packages/resources/*.data
    /usr/lib/python2.7/site-packages/gui/...
    /usr/lib/python2.7/site-packages/logic/...
    
  4. 我的应用程序结构有问题吗?

    这些资源、图标或其他文件应该放在某个特定的Python包里,而不是放在项目根目录下吗?这样在 setup.py 中我就可以用 package_data 把它们复制到正确的位置。

1 个回答

1

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期工作,或者出现了错误信息。这种情况下,通常我们会去网上查找解决方案,看看其他人是怎么处理类似的问题的。

在StackOverflow上,很多人会分享他们的经验和解决办法。你可以看到各种各样的问题和答案,帮助你更好地理解如何使用这些工具。记住,遇到问题是很正常的,关键是要学会寻找信息和解决方案。

from ez_setup import use_setuptools
use_setuptools()
from setuptools import setup

setup(name="somename",
      version="1.0",
      description="description string",
      long_description="""\
long description
""",
      author="Foo",
      author_email="bar@gmail.com",
      url="http://nowhere.com",
      include_package_data=True,
      license="MIT",
      packages=["gui", "logic"],
      package_dir={
            "gui": "myApp/gui",
            "logic": "myApp/logic",
            },
      classifiers=[
         "Development Status :: 5 - Production/Stable",
         "Topic :: Utilities",
         "License :: OSI Approved :: MIT License"
      ],
      data_files=[
          ('/path/to/resources', ['resources/x.data', 'resources/y.data']),
          ('/path/to/icons', ['myApp/icons/a.ico', 'myApp/icons/e.ico'])
      ]
      )

撰写回答