14

我正在尝试使用distutils. 不幸的是,我的目录结构如下所示:

/代码
    /我的包
        __init__.py
        文件1.py
        文件2.py
        /分包
            __init__.py
    /建造
        安装程序.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预期?

4

5 回答 5

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在构建内部:

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

我喜欢你正在尝试的目录结构。我从没想过setup.py它足够特别,足以保证在根代码文件夹中。但不管你喜不喜欢,我认为这就是你的发行版的用户所期望的。因此,您必须欺骗 distutils 做其他事情也就不足为奇了。该data_files参数是一种将您的 setup.py 放入您所在位置的发行版的技巧。

于 2009-05-02T04:08:59.380 回答
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)))

等。不确定这是否有效,但应该很容易尝试。

于 2009-05-03T03:46:00.910 回答
2

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

在您的情况下,将 setup.py 放在 code/

代码/还应包括:

  • 许可证.txt
  • 自述文件.txt
  • 安装.txt
  • 待办事项.txt
  • 变更日志.txt

当您运行“setup.py sdist”时,它应该自动生成一个清单,包括: - py_modules 和/或包中指定的任何文件 - setup.py - README.txt

要添加更多文件,只需手动编辑 MANIFEST 文件以包含项目所需的任何其他文件。

对于这个有点体面的解释阅读this

要查看工作示例,请查看我的项目

注意:我没有将 MANIFEST 置于版本控制之下,因此您不会在那里找到它。

于 2010-06-15T04:14:33.183 回答
0

也是一个蹩脚的解决方法,但构建项目内的包目录的连接/链接应该可以工作。

于 2015-02-24T09:33:38.220 回答
0

一个有点蹩脚的解决方法,但我可能只是使用一个将 ./mypackage 同步到 ./build/mypackage 的 Makefile,然后从 ./build 内部使用通常的 distutils 语法。事实上,distutils 期望将 setup.py 解压到 sdist 的根目录下,并在其中放置代码,因此您将花费大量时间说服它不这样做。

当你清理时,你总是可以对副本进行核对,这样你就不必弄乱你的 vcs。

于 2009-05-01T17:15:34.973 回答