我正在尝试使用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
期望的内容的情况下更正此问题?
答案 0 :(得分:5)
您希望在分发档案文件中使用哪种目录结构?和你现有的结构一样吗?
您可以使用此修改后的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置于您找到的同一位置的分发中的黑客攻击。
答案 1 :(得分: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)))
等。不确定这是否有效,但应该很容易尝试。
答案 2 :(得分:2)
从项目的根文件夹运行setup.py
在您的情况下,将setup.py放在代码/
中代码/还应包括:
当您运行“setup.py sdist”时,它应自动生成MANIFEST,包括: - py_modules和/或包中指定的任何文件 - setup.py - README.txt
要添加更多文件,只需手动编辑MANIFEST文件,以包含项目所需的任何其他文件。
对于这个read this的解释。
要查看结帐my project的工作示例。
注意:我没有将MANIFEST置于版本控制之下,所以你不会在那里找到它。
答案 3 :(得分:0)
一种蹩脚的解决方法,但我可能只是使用一个Makefile,它将./mypackage发送到./build/mypackage,然后使用./build里面常用的distutils语法。事实上,distutils希望将setup.py解压缩到sdist的根目录并在那里设置代码,所以你将有一段时间让他们相信它不会这样做。
当您打扫干净时,您可以随时对副本进行核对,这样您就不必搞砸了你的副本。
答案 4 :(得分:0)
也是一种蹩脚的解决方法,但构建项目内的包目录的联结/链接应该可以正常工作。