繁体   English   中英

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

[英]How can I get my setup.py to use a relative path to my files?

我正在尝试使用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期望的情况下更正此问题?

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

您可以使用此修改后的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参数是一个hack,可以让你的setup.py进入你找到它的同一个地方。

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

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

代码/还应包括:

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

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

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

对于这个有点像样的解释, 请阅读本文

查看工作示例签出我的项目

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

是否可以先将其更改为父目录?

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

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

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

一个蹩脚的解决方法,但我可能只是使用一个Makefile,它将./mypackage发送到./build/mypackage,然后使用./build里面常用的distutils语法。 事实上,distutils希望将setup.py解压缩到sdist的根目录并在那里有代码,所以你将有一段时间说服它做其他事情。

当你打扫干净时,你可以随时核对副本,这样你就不必弄乱你的vcs了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM