【问题标题】:How can I get my setup.py to use a relative path to my files?如何让 setup.py 使用文件的相对路径?
【发布时间】:2010-10-23 04:07:22
【问题描述】:

我正在尝试使用 distutils 构建 Python 发行版。不幸的是,我的目录结构是这样的:

/代码 /我的包 __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 的要求的情况下更正此问题?

【问题讨论】:

    标签: python distutils


    【解决方案1】:

    您希望分发存档文件中的目录结构是什么?和你现有的结构一样吗?

    您可以使用修改后的 setup.py 将所有内容打包到一个更高的目录(在您的示例中为 code):

    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 放入分发版中的技巧。

    【讨论】:

    • 我不太关心分发文件中的结构是什么样的,只要当用户尝试使用 easy_install 安装它时它做正确的事情。但是当涉及到这些细节时,Python 文档绝对是可怕的——我什至不知道结构应该是什么样子。而且我仍然在考虑在安装分发之前在分发中运行脚本以安装分发的想法。
    【解决方案2】:

    是否先切换到父目录?

    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)))
    

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

    【讨论】:

      【解决方案3】:

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

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

      代码/还应包括:

      • LICENSE.txt
      • README.txt
      • 安装.txt
      • TODO.txt
      • CHANGELOG.txt

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

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

      对于这个 read this 的一些体面的解释。

      查看工作示例结帐my project

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

      【讨论】:

        【解决方案4】:

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

        您可以在清理时随时对副本进行核对,这样您就不必弄乱您的 vcs。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多