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

Chr*_* B. 12 python distutils

我正在尝试用它构建一个Python发行版distutils.不幸的是,我的目录结构如下所示:

/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',
) 
Run Code Online (Sandbox Code Playgroud)

当我python setup.py sdist正确运行它时会生成清单文件,但不会在分发中包含我的源文件.显然,它创建了一个包含源文件的目录(即mypackage1),然后复制每个源文件mypackage1/../mypackage,将它们放在分发之外.

如何在不强制我的目录结构符合distutils预期的情况下更正此问题?

Jon*_*ric 6

您想要在分发存档文件中使用什么目录结构?与您现有的结构相同吗?

您可以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']
)
Run Code Online (Sandbox Code Playgroud)

您将运行此命令(在code目录中):

python build/setup.py sdist
Run Code Online (Sandbox Code Playgroud)

或者,如果您想保留dist内部版本:

python build/setup.py sdist --dist-dir build/dist
Run Code Online (Sandbox Code Playgroud)

我喜欢您想要的目录结构。我从来没有想过setup.py足以保证它位于根代码文件夹中。但是,不管您喜欢与否,我认为这是您的发行版用户所期望的。因此,您必须欺骗distutils做其他事情也就不足为奇了。该data_files参数是一种hack,可以将setup.py放入与您位于同一位置的发行版中。

  • 我并不在乎分发文件中的结构是什么样子,只要它在用户尝试使用easy_install进行安装时能正确执行操作即可。但是当涉及到这些细节时,Python文档绝对是可怕的-我什至不知道该结构的外观。而且,我仍然想着要在安装发行版之前先在发行版中运行脚本的想法。 (5认同)

eas*_*sel 0

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

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