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

2024-05-17 06:58:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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的要求,我该如何更正?


Tags: 文件py目录packageinitsetupcode结构
3条回答

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

在您的例子中,将setup.py放在代码/

代码/还应包括:

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

当您运行“setup.py sdist”时,它应该自动生成清单,包括: -py_模块和/或包中指定的任何文件 -安装程序.py -自述文件

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

对于这个read this有点像样的解释。

查看签出my project的工作示例。

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

在分发存档文件中需要什么目录结构?和你现有的结构一样?

您可以使用此修改的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放入发行版中的技巧,该发行版位于您找到它的同一位置。

可能是先换到父目录了吗?

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

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

相关问题 更多 >