一半君的总结纸

听话只听一半君

Single-File Stand-alone Python 2.7.11 x64 for Windows

想象不到这种东西的使用情景,不过,既然原作者给了py2exe的setup.py,那生成一个x64的应该也是可以的吧

准备材料

  • 还有用来压缩的upx
  • ps:
    遇到的错误有

    • error: bundle-files 1 not yet supported on win64
      

      lz终于知道原作者为啥没做x64的了,不是他不想,是py2exe至今(0.6.9 上次更新是2008年,这也太老了吧)都还没支持64位系统下打包成单个exe文件

    所以下面试试pyinstaller

    pip install pyinstaller
    
    # 或者还可以试试另外几个
    pip install  cx_Freeze
    

    但是,python本身自己已经是exe的了,其实就算你不像上面那样折腾,直接手动把他拷走,用自解压然后自动运行的工具也是一样的,估计会更卡一些

    而且官网已经有这种东西了,比如eGenix PyRun ,不过不幸的是现在还没windows版

    • 试验1 用pyinstaller
      # 遇到错误
        for real_module_name, six_module_name in real_to_six_module_name.items():
      AttributeError: 'str' object has no attribute 'items'
      
      # 装了这个
      pip install six
      

      lz按照原作者的方法,用help(‘modules’)和help(‘modules .’)得到了所有modules的列表,贴进了py.py里,此外还手动去掉了不少,比如py2exe的pyinstaller的和cx_freeze的,由于是特别新装的python,没有其他的module了,但是还是行数比原作者的多很多,所以出来的py.exe也有15mb,运行也会硬直2s,lz比较了下比原作者多哪些,作者的我的diff结果,似乎还是多不少,lz继续去掉了些看名字就觉得不会用到的比如idlelib还有名字里带test.的,最后原作者的是有600多行,lz的有900多行,upx后也小到14mb,还是慢,难道就直接用原作者的么,lz不确定多出来的那些有没有用,如果直接用原作者的,在使用中发现什么module没有再加进去也行

      不幸的是lz感觉这和import多少关系不大,lz试了下onedir mode,秒开,看来似乎是因为onefile模式启动时候解压过程太费时间

      edit: lz验证了下,直接使用原作者的import列表,也是启动时硬直几秒,看来是lz使用pyinstaller的姿势问题,请大神指点

      # 直接这样就可以
      pyinstaller --onefile  py.py
      
      # 如果想改改设置 可以在上面这一步生成的spec文件里改
      pyinstaller --onefile  py.spec
      
    • 试验2 用cxfreeze
      lz把原作者的py.py里的module们重新贴了一下,(sublime里右键+shift可以选列,edit菜单里有sort lines和permute lines->unique这两个功能可以删掉重复的行)

      使用默认自动生成的setup.py也能顺利打包完成,但是这没什么意义吧。lz试了下IExpress 和7-zip sfx module,前者没法把命令行参数传给python,后者运行的时候会跳出个新的console窗口

    • 试验3 此外如果你想要的是portable的python program,不用上面的打包工具,直接用Python自带的Freeze也可以,这个功能之前在Tools/Freeze下,后来好像被挪到pip里了

      先像下面这样用sparse checkout把他拿到,不然你要clone整个repo的话很慢,慢不可避免,linux下如果没打算以后push了,可以用git-archive

      git archive --remote=<repo_url> <branch> <path> | tar xvf -
      

      此外linux下有些脚本工具能直接下子文件夹,windows下似乎没什么好办法

      mkdir python
      cd python
      git init
      git remote add origin https://github.com/python-git/python.git
      
      # 好像意义不大 没试出来能快,因为下面pull的时候其实还是fetch了全部data
      git config core.sparsecheckout true
      
      # this has to be run in git bash, not in windows prompt, or you will see
      # error: Sparse checkout leaves no entry on working directory 
      echo "Tools/freeze/*" >> .git/info/sparse-checkout
      
      # 屈服了,只好拿全部data了
      git fetch origin 2.7 --depth=1
      git checkout origin/2.7 -- Tools/freeze
      

      上面echo那步必须用git bash,不然echo命令写进的文件带BOM marker下一步会出错

      试用时他又讲说

      > python freeze.py hello.py
      Error: needed directory c:\Python27\lib\python2.7\config not found
      

      放弃,这个太老了,不想乱试了

    • 试验4 啥都不用,直接用自解压然后运行的工具
      因为上面已经试过了,所以目测也不好用

    半成品下载:
    pyexe-2.7.11.zip

    gfycat

    出处:
    Single-File Stand-alone Python 2.7.9 for Windows
    Create a portable Python with Pip on Windows
    Alternative Python Implementations
    Portable Python
    cx_Freeze – Single-file executables
    On Windows git: “error: Sparse checkout leaves no entry on the working directory”
    Freeze – Python Wiki
    Download a single folder or directory from a GitHub repo
    Subdirectory Checkouts with git sparse-checkout
    Is there any way to clone a git repository’s sub-directory only?

    Advertisements

    发表评论

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / 更改 )

    Twitter picture

    You are commenting using your Twitter account. Log Out / 更改 )

    Facebook photo

    You are commenting using your Facebook account. Log Out / 更改 )

    Google+ photo

    You are commenting using your Google+ account. Log Out / 更改 )

    Connecting to %s

    %d 博主赞过: