Python 2.6 及更高版本能够直接执行 .zip 文件(如果 zip 文件包含__main__.py
文件位于 zip 存档的顶部。我想利用此功能来提供我正在开发的工具的预览版本,该工具除了将 .zip 文件复制到磁盘之外不需要安装任何内容。是否有创建此类 zip 文件的标准方法?我正在寻找适用于 python 2.6 和 python 2.7 的解决方案。
理想情况下,我想使用 distutils,因为当我想要进行正常安装时,它已经可以工作了。是否有使用(或扩展)distutils 来创建此类 .zip 文件的规范方法?
distutils 提供了一个sdist
命令创建一个源发行版almost是的,但是创建的结构有点太深了。
例如,我的源代码树如下所示:
my_package/
- setup.py
- src/
- __main__.py
- module1/
- module2/
- module3/
当我做python setup.py sdist
我最终得到一个具有以下结构的 .zip 文件:
my_package-0.1.zip
- my_package-0.1/
- README.txt
- PKG_INFO
- src/
- __main__.py
- module1/
- module2/
- module3/
这是不可执行的,因为__main__.py
不在分布的顶部。实际上我想要的是一个不包含的 src 发行版src
,但仅限于以下文件src
。那,或者确切地说是什么sdist
给了我,但还有额外的__main__.py
在存档的顶部。
Updated: 自从setup.cfg
是全局的,它会影响所有命令的“install-lib”设置,这不是我们想要的。不幸的是(据我所知)没有办法通过命令行将选项传递给子命令,例如如果你指定bdist --install-lib=/
它会引发错误,而不是将其传递给子命令。
定制install-lib
为了install
子命令only when bdist
运行时,您可以子类化bdist_dumb
命令并在之后手动设置路径install
子命令被构造/重新初始化:
setup.py
from distutils.core import setup
from distutils.command.bdist_dumb import bdist_dumb
class custom_bdist_dumb(bdist_dumb):
def reinitialize_command(self, name, **kw):
cmd = bdist_dumb.reinitialize_command(self, name, **kw)
if name == 'install':
cmd.install_lib = '/'
return cmd
if __name__ == '__main__':
setup(
# our custom class override
cmdclass = {'bdist_dumb': custom_bdist_dumb},
name='my_package',
py_modules = ['__main__'],
packages = ['module1', 'module2'],
package_dir = {'': 'src'}
)
Running:
% python setup.py bdist --format=zip
% unzip -l dist/my_package-0.0.0.linux-x86_64.zip
Archive: dist/my_package-0.0.0.linux-x86_64.zip
Length Date Time Name
--------- ---------- ----- ----
184 2011-05-31 20:34 my_package-0.0.0.egg-info
30 2011-05-31 20:34 __main__.py
128 2011-05-31 20:34 __main__.pyc
107 2011-05-31 20:34 module1/__init__.pyc
0 2011-05-31 20:27 module1/__init__.py
107 2011-05-31 20:34 module2/__init__.pyc
0 2011-05-31 20:27 module2/__init__.py
--------- -------
556 7 files
% python dist/my_package-0.0.0.linux-x86_64.zip
my_package working.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)