如何让我的setup.py使用相对路径指向文件?

16 投票
5 回答
19582 浏览
提问于 2025-04-15 11:21

我正在尝试用 distutils 来构建一个 Python 的发行版。不过,我的文件夹结构是这样的:

/code
    /mypackage
        __init__.py
        file1.py
        file2.py
        /subpackage
            __init__.py
    /build
        setup.py

这是我的 setup.py 文件:

from distutils.core import setup

setup(
    name = 'MyPackage',
    description = 'This is my package',
    packages = ['mypackage', 'mypackage.subpackage'], 
    package_dir = { 'mypackage' : '../mypackage' }, 
    version = '1',
    url = 'http://www.mypackage.org/',
    author = 'Me',
    author_email = 'me@here.com',
) 

当我运行 python setup.py sdist 时,它能正确生成清单文件,但却没有把我的源文件包含在发行版里。看起来它会创建一个文件夹来放源文件(也就是 mypackage1),然后把每个源文件复制到 mypackage1/../mypackage,这样就把它们放在了发行版的外面。

我该怎么解决这个问题,而不需要强迫我的文件夹结构去符合 distutils 的要求呢?

5 个回答

2

从项目的根文件夹运行 setup.py

在你的情况下,把 setup.py 放在 code/ 文件夹里。

code/ 文件夹里还应该包含:

  • LICENSE.txt
  • README.txt
  • INSTALL.txt
  • TODO.txt
  • CHANGELOG.txt

当你运行 "setup.py sdist" 时,它会自动生成一个叫做 MANIFEST 的文件,里面包括:

  • 在 py_modules 和/或 packages 中指定的任何文件
  • setup.py 文件
  • README.txt 文件

如果你想添加更多文件,可以手动编辑 MANIFEST 文件,把你项目需要的其他文件加进去。

想要更详细的解释,可以看看这个链接

如果想看一个实际的例子,可以去我的项目看看。

注意:我没有把 MANIFEST 文件放在版本控制里,所以你在那儿找不到它。

3

先让它切换到上一级目录怎么样?

import os
os.chdir(os.pardir)

from distutils.core import setup

等等。

或者,如果你可能会从任何地方运行它(虽然这样做有点过头,但...):

import os.path
my_path = os.path.abspath(__file__)
os.chdir(os.normpath(os.path.join(my_path, os.pardir)))

等等。不确定这样是否有效,不过试试看应该很简单。

7

你希望在发布的压缩文件里有什么样的文件夹结构?是想和你现在的结构一样吗?

你可以把所有东西放在上一级文件夹里(在你的例子中就是code),只需要修改一下setup.py文件:

from distutils.core import setup

setup(
    name = 'MyPackage',
    description = 'This is my package',
    packages = ['mypackage', 'mypackage.subpackage'], 
    version = '1',
    url = 'http://www.mypackage.org/',
    author = 'Me',
    author_email = 'me@here.com',
    script_name = './build/setup.py',
    data_files = ['./build/setup.py']
)

然后你可以在code文件夹里运行这个命令:

python build/setup.py sdist

或者,如果你想把dist放在build文件夹里:

python build/setup.py sdist --dist-dir build/dist

我觉得你想要的文件夹结构挺好的。我从来没觉得setup.py放在根目录下的代码文件夹里有多特别。不过,不管你喜不喜欢,我觉得使用你发布包的人会期待它在那个位置。所以,你需要用一些小技巧来让distutils做点别的事情也就不奇怪了。data_files这个参数其实是个小窍门,目的是把你的setup.py放到和它现在所在位置一样的地方。

撰写回答