无法使用distutils
我写了一个Python脚本,里面用到了我自己创建的一个包。我需要把它打包,这样就可以在多个服务器上安装,但我一直搞不定setup.py,让它找到我的脚本。
我的脚本分成两个部分:connections.py和一个被导入为X.utils.printing的模块(X是我的组名)。我需要用distutils把这两个部分打包在一起。
我看了大约五遍Python Distutils的文档,但还是搞不懂。
我需要做的事情有: 1) 确保我的打印模块可以安装,并且可以通过
from X.utils.printing import PrettyPrint as PP
导入。
2) 把connections.py放到/usr/sbin/目录下。
这应该很简单,但现在变得让我很抓狂。
这是我目前的setup.py,但它不工作:
from distutils.core import setup
setup(name='connections', version='0.1.1',
description='Print number of IHS connections',
author='fandingo', author_email='fandingo@fandingo.com',
package_dir = {'X.utils' : 'X'},
packages=['X.utils.printing'], py_modules=['printing', 'connections'])
setup.py在一个叫做'python'的目录下运行,里面有connection-stats/和X。connection-stats里面有connections.py,X里面有init.py,utils/init.py和utils/printing.py。
当我尝试运行setup.py时,输出如下:
python setup.py bdist
正在运行bdist 正在运行bdist_dumb
正在构建 正在构建py文件
打印模块printing.py没有找到
文件connections.py没有找到
错误:包目录'X/printing'不存在
有人能帮我修复我的setup.py吗,这样我就可以打包我的脚本和模块了?
谢谢大家的帮助。
编辑:我还没有尝试把connections.py复制到/usr/sbin/。我还没能解决distutils找不到我的模块的问题。
编辑2: 我觉得我离成功更近了,但我的包结构还是不太对。
使用
setup(name='connections', version='0.1.1', description='Print number of IHS connections',
author='fandingo', author_email='fandingo@fanding.com',
package_dir = {'printing' : 'X/utils'}, packages=['printing'],
scripts=['connection-stats/connections.py'])
我成功构建了,connections.py应该会被放到安装时的/usr/sbin/目录下。唯一的问题是,打印模块没有以X.utils.printing的形式被导入。
我可以改成包含X,但这样就不包括子包了。
setup(name='connections', version='0.1.1',
description='Print number of IHS connections',
author='fandingo',
author_email='fandingo@fandingo.com',
packages=['X'],
scripts=['connection-stats/connections.py'])
这里的问题是X被导入了,但只有init.py被包含,utils/没有被包含,这意味着我得不到utils/printing.py。
就像我需要某种递归选项,这样我可以把X和它下面的所有东西都加进去。有什么想法吗?
谢谢,
----------------------
编辑3:
快完成了。我发现我需要明确列出X中的每个子包。这是修正后的setup.py:
setup(
name='connections',
version='0.1.1',
description='Print number of IHS connections',
author='fandingo',
author_email='fandingo@fandingo.com',
package_dir = {'utils' : 'X/', 'printing' : 'X/utils/'},
packages=['X', 'X.utils'],
py_modules = ['printing'],
scripts=['connection-stats/connections.py'])
唯一的问题是connections.py没有被移动到/usr/sbin/。我想我会加一个安装后选项来手动移动它。
2 个回答
你的包、py_modules 和 package_dir 的设置太复杂了。我们先放慢脚步,想想你想要分发的文件结构是什么样的。如果我没理解错的话,你的目标是一个叫做 X 的包,里面有一个子包 X.utils,这个子包里有一个模块叫做 X.utils.printing。所以,你在调用 setup 的时候应该写成 setup(..., packages=['X', 'X.utils'])。换句话说,distutils 不会自动包含包里的所有子包(你需要明确指定 X.utils),但它会包含包里的所有模块(你不需要指定 py_modules=['X.utils.printing'])。你能试试看这样做吗?
其次,distutils 不支持 sbin。我们正在为 distutils2 解决这个问题。
我觉得你可能需要类似下面这样的东西:
from distutils.core import setup
setup(name='connections',
version='0.1.1',
description='Print number of IHS connections',
author='fandingo',
author_email='fandingo@fandingo.com',
packages=['X'],
scripts=['connection-stats/connections.py'])
更新:修复包的列表