<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用PyInstaller打包Python程序

      使用PyInstaller打包Python程序

      PyInstaller介紹:

      PyInstaller是一個能將Python程序轉換成單個可執行文件的程序, 操作系統支持Windows, Linux, Mac OS X, Solaris和AIX。并且很多包都支持開箱即用,不依賴環境。

      環境為windows7操作系統,python2.7.8 virtual environment

      官網:https://github.com/pyinstaller/pyinstaller

      詳細步驟:

      1. win7下面先安裝這個依賴:pywin32,下載下來后切換到venv2.7,然后使用easy_install xxx.exe安裝

      2. pip安裝PyInstaller:

      1
      
      pip install pyinstaller

      3. 打包過程中可能會出現msvcp90.dll找不到的問題, 去http://cn.dll-files.com/msvcp90.dll.html下載第三個zip文件, 解壓后放到C:\Windows\System32,如果是64位的還要放到C:\Windows\SysWOW64目錄下。

      4. 再次運行報MSVCR90.dll找不到,同理去http://cn.dll-files.com/MSVCR90.dll.html下載MSVCR90.dll, 放到C:\Windows\System32和C:\Windows\SysWOW64中。

      5. 將你的整個程序先復制到某個臨時文件夾下面,比如D:\tmp\core-wxpython,此目錄下有個main.py是執行入口

      6. 執行build命令,并添加必要的搜索路徑,外加執行文件的圖標:

      1
      2
      
      cd D:\tmp\core-wxpython
      pyinstaller -F -w -i d:\tmp\main.ico main.py

      如果還想添加自定義的依賴庫,就要加上-p參數:

      1
      
      pyinstaller -F -w -p D:\tmp\core-python\libs -i d:\tmp\main.ico main.py

      參數說明:

      -F 表示生成單個可執行文件
      -w 表示去掉控制臺窗口,這在GUI界面時非常有用。不過如果是命令行程序的話那就把這個選項刪除吧!
      -p 表示你自己自定義需要加載的類路徑,一般情況下用不到
      -i 表示可執行文件的圖標
      

      注意的事情

      1). 檢查生成的\XXX\build\pyi.win32\XXX\warnXXX.txt(XXX是你的項目名)中, 是否缺少了必要的模塊。如果有缺少的,那么去如上所述,添加必要的搜素路徑, 使得pyinstaller在運行時,可以找到對應的模塊并集成進來。

      2). 此處我這里沒有UPX,暫時沒去折騰。估計是用UPX去壓縮,壓縮后所生成的exe文件的大小,會小得多。

      7. 如果發現報錯:pywintypes.error: (193, ‘LoadLibraryEx’… ) 原因是添加圖標后綴必須是xxx.ico才行,重新去網上下載一個ico格式的圖片,再次運行就好了。

      8. 我測試了一個使用wxpython寫的gui程序,源碼里面引用了一張圖片, 使用wx.Image(os.path.abspath(file/me.jpg), wx.BITMAP_TYPE_JPEG)來加載, 然后打包成exe后發現找不到圖片了,報錯。

      解決辦法:

      第一步,在程序中將資源文件都放到一個單獨的文件夾中,比如項目根目錄下面的resources

      第二步,修改程序中引用這些資源文件比如圖片的代碼:

      1
      2
      3
      4
      5
      6
      7
      
      def resource_path(relative_path):
          """定義一個讀取相對路徑的函數"""
          if hasattr(sys, "_MEIPASS"):
              base_path = sys._MEIPASS
          else:
              base_path = os.path.abspath(".")
          return os.path.join(base_path, relative_path)
      

      然后每次在獲取圖片的時候,這么引用它的目錄:

      1
      
      img = wx.Image(resource_path('resources/me.jpg'), wx.BITMAP_TYPE_JPEG)
      

      第三步,先運行第6步生成一個main.spec文件

      第四步,修改main.spec文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      # -*- mode: python -*-
      a = Analysis(['main.py'],
                   pathex=['d:\\tmp\\core-wxpython'],
                   hiddenimports=[],
                   hookspath=None,
                   runtime_hooks=None)
      pyz = PYZ(a.pure)
      exe = EXE(pyz,
                a.scripts,
                a.binaries,
                a.zipfiles,
                a.datas,
                [('\\resources\\me.jpg','D:\\tmp\\core-wxpython\\resources\\me.jpg','DATA')],
                name='main.exe',
                debug=False,
                strip=None,
                upx=True,
                console=True , icon='d:\\tmp\\main.ico')
      

      注意:我在a.datas下面添加了那行配置,具體的路徑自己去修改下。

      上面是添加單個文件,如果有多個文件,可以一個個的添加。不過如果文件多了話,那么就使用下面的方法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      
      # -*- mode: python -*-
      a = Analysis(['main.py'],
                   pathex=['d:\\tmp\\core-wxpython'],
                   hiddenimports=[],
                   hookspath=None,
                   runtime_hooks=None)
      
      def extra_datas(mydir):
          def rec_glob(p, files):
              import os
              import glob
              for d in glob.glob(p):
                  if os.path.isfile(d):
                      files.append(d)
                  rec_glob("%s/*" % d, files)
          files = []
          rec_glob("%s/*" % mydir, files)
          extra_datas = []
          for f in files:
              extra_datas.append((f, f, 'DATA'))
      
          return extra_datas
      
      # append the 'resources' dir
      a.datas += extra_datas('resources')
      
      pyz = PYZ(a.pure)
      exe = EXE(pyz,
                a.scripts,
                a.binaries,
                a.zipfiles,
                a.datas,
                name='main.exe',
                debug=False,
                strip=None,
                upx=True,
                console=True , icon='d:\\tmp\\main.ico')
      

      它會把某個指定的文件下的所有文件遞歸的添加到最終的包中。省去很多事情!

      第五步,執行:pyinstaller D:\tmp\core-wxpython\main.spec

      然后就大功告成了!!!在dist目錄下面有個main.exe單獨的可執行文件,打開它吧。^_^

      如果在執行過程中出錯,或者雙擊打開沒任何反應。 可以先去掉-w參數后,在控制臺窗口打開這個可執行文件,會輸出詳細出錯信息去調試。

      其他問題記錄

      1. 找不到pkg_resources

      ImportError: No module named pkg_resources
      

      解決辦法是在安裝pycrypto之前,先安裝distribute庫

      1
      
      curl https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/trunk/distribute_setup.py | python
      

      然后再安裝windows下面對應的pycrypto庫

      1
      2
      
      # http://www.voidspace.org.uk/python/modules.shtml#pycrypto
      easy_install http://www.voidspace.org.uk/downloads/pycrypto26/pycrypto-2.6.win-amd64-py2.7.exe
      

      2. 打包時加上-w選項去掉console時出錯

      不要在程序中使用任何print語句,或者是你將stdout重定向到一個日志、文件或任何其他非控制臺地方。

      最好的方法是利用日志功能,將輸出定向到日志文件中去,在main函數開頭添加如下代碼:

      1
      2
      3
      4
      5
      
      import logging
      import tempfile
      logging.basicConfig(level=logging.INFO,
                          filename=tempfile.TemporaryFile().name,
                          format='%(asctime)s %(message)s')
      

      用到logging的時候,需要配置日志到文件中,而不是console:

      1
      2
      
      import logging
      _LOGGING = logging.getLogger(__file__)
      

      3. pyinstaller用one file方式打包的程式如果有用到subprocess.Popen會有問題

      問題參考:http://www.pyinstaller.org/ticket/597

      最後找到的方法是 http://code.activestate.com/recipes/578300-python-subprocess-hide-console-on-windows/

      建立一個隱藏窗口,就正常了~

      最后用pyinstaller設one folder & no console打包都不跳出小窗口了

      解決辦法就是自定義一個subprocess_call函數來代替subprocess的call調用,不適用Popen了:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      def subprocess_call(*args, **kwargs):
          # also works for Popen. It creates a new *hidden* window,
          # so it will work in frozen apps (.exe).
          if IS_WIN32:
              _LOGGING.info('subprocess_call==IS_WIN32')
              startupinfo = subprocess.STARTUPINFO()
              startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW
              startupinfo.wShowWindow = subprocess.SW_HIDE
              kwargs['startupinfo'] = startupinfo
          retcode = subprocess.call(*args, **kwargs)
          return retcode
      

      調用方法:

      1
      
      exresult = subprocess_call(exe_command, shell=True)
      

      這個方法會等命令執行完成,返回值為0表示正常結束!

      4. 打包后不能放到中文路徑下執行 解決辦法是下載安裝PyInstaller的中文支持庫,安裝后再重新執行pyinstaller打包命令:

      1
      2
      3
      
      git clone https://github.com/dkw72n/pyinstaller.git
      python setup.py install
      pyinstaller -F -w -i d:\tmp\main.ico main.py
      posted @ 2015-06-16 16:06  狂師  閱讀(1729)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99国产欧美另类久久久精品| 亚洲精品乱码久久久久久按摩高清| 久热久精久品这里在线观看| 色综合AV综合无码综合网站| 久久天天躁狠狠躁夜夜躁2o2o| 欧美成aⅴ人高清免费| 97一期涩涩97片久久久久久久| 合作市| 亚洲精品一区二区三区免| 亚洲夂夂婷婷色拍ww47| 亚洲天堂一区二区三区四区 | 亚洲国产欧美在线人成aaaa| 日韩中文字幕人妻精品| 成a人片亚洲日本久久| 国产短视频精品一区二区| 无码成人一区二区三区| 边添小泬边狠狠躁视频| 偷偷色噜狠狠狠狠的777米奇| 国产精品妇女一区二区三区| 亚洲av永久无码精品漫画| 无码激情亚洲一区| 日本无人区一区二区三区| 全免费A级毛片免费看无码| 又黄又刺激又黄又舒服| 国产女人高潮视频在线观看| 久久亚洲精品国产精品尤物 | 久久精品国产99亚洲精品| 精品无码久久久久国产电影| 起碰免费公开97在线视频| 亚洲精品天堂在线观看| 午夜国产精品福利一二| 国产suv精品一区二区883| 国产成人精品午夜在线观看| 国内自拍视频一区二区三区| 久久国产乱子精品免费女| 久久国产综合色免费观看| 色欲av亚洲一区无码少妇 | 精品嫩模福利一区二区蜜臀| 亚洲欧美综合人成在线| 天堂资源国产老熟女在线| 不卡国产一区二区三区|