如何使用distutils创建可执行的.zip文件?

Bry*_*ley 6 python distutils python-2.6

如果zip文件包含__main__.pyzip存档顶部的文件,Python 2.6及更高版本可以直接执行.zip文件.我想利用此功能提供我正在开发的工具的预览版本,除了将.zip文件复制到磁盘之外,不需要用户安装任何东西.有没有标准的方法来创建这样的zip文件?我正在寻找一个适用于python 2.6和python 2.7的解决方案.

理想情况下,我想使用distutils,因为当我想进行正常安装时,我已经使用了distutils.是否有规范的方法来使用(或扩展)distutils来创建这样的.zip文件?

distutils提供了一个sdist命令,它可以创建几乎正确的源分布,但会创建一个有点太深的结构.

例如,我的源代码树如下所示:

my_package/
  - setup.py
  - src/
      - __main__.py
      - module1/
      - module2/
      - module3/
Run Code Online (Sandbox Code Playgroud)

当我这样做时,python setup.py sdist我得到一个具有以下结构的.zip文件:

my_package-0.1.zip
  - my_package-0.1/
      - README.txt
      - PKG_INFO
      - src/
          - __main__.py
          - module1/
          - module2/
          - module3/
Run Code Online (Sandbox Code Playgroud)

这不可执行,因为__main__.py它不在分发的顶部.实际上我想要的是一个src发行版,它不包括src,但只包含文件src.那个,或者恰恰是什么sdist给了我,但__main__.py在档案的顶部还有一个额外的东西.

sam*_*ias 5

已更新:由于setup.cfg是全局变量,因此会影响所有命令的“ install-lib”设置,这不是必需的。不幸的是,据我所知,没有办法通过命令行将选项传递给子命令,例如,如果您指定bdist --install-lib=/它会引发错误,而不是将错误传递给子命令。

要自定义install-libinstall子命令只有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'}
    )
Run Code Online (Sandbox Code Playgroud)

运行:

% 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.
Run Code Online (Sandbox Code Playgroud)