簡體   English   中英

cx_freeze - 包括我自己的模塊?

[英]cx_freeze - including my own modules?

我有一個用 PyQt4 構建的小應用程序,我試圖用 cx_freeze 凍結它,但是我遇到了 cx_freeze 的問題,包括我自己的一些應用程序運行所需的模塊。

我在我的應用程序中導入了兩個模塊,它們位於應用程序所在的文件夾中。 IE:

申請途徑:

Python\\DataViewer-PyQt4\\DataViewer.py

其他模塊:

Python\\我的分析包\\Ephystools

Python\\我的分析包\\PrairieAnalysis

在我的應用程序中,我通過使用導入這些(如果它們不在我的 python 路徑中)

sys.path.append(os.path.abspath('../My Analysis Packages'))

我已經嘗試在 setup.py 文件的“includes”和“packages”中包含 PrairieAnalysis 和 EphysTools。 我也試過包括“我的分析包”。 我也嘗試提供這些路徑。

它們都包含init .py 文件,因為實際應用程序能夠很好地導入它們。

如果我將 PrairieAnalysis 和/或 EphysTools 放在 'includes' 列表中,則 setup.py build 返回一個 ImportError:

 File "C:\Anaconda3\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
    raise ImportError("No module named %r" % name)
ImportError: No module named 'PrairieAnalysis'

如果我將它們排除在“包含”之外,setup.py 構建完成,但是當我打開應用程序時,我會遇到同樣的錯誤。

我已經查看了各種 cx_freeze 模塊導入問題,但似乎沒有一個處理過這種特殊情況。

我的實際 setup.py:

# -*- coding: utf-8 -*-

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

options = {
    'build_exe': {
        'includes': ['atexit', 'PrairieAnalysis', 'EphysTools'],
    }
}

executables = [
    Executable('DataViewer.py', base=base)
]

setup(name='DataViewer',
      version='0.1',
      description='Application for viewing Prairie-generated csv data files',
      options=options,
      executables=executables
      )

編輯 1:setup.py 文件中 os.getcwd() 的輸出:

D:\OneDrive\Documents\Python\DataViewer-PyQt4

setup.py 文件中 sys.path 的輸出:

    ['D:\\OneDrive\\Documents\\Python\\DataViewer-PyQt4', 'D:\\OneDrive\\Documents\\Python\\My Analysis Packages', 'C:\\Anac
    onda3\\python34.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages',
     'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.2.3-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3
    \\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\r
    unipy-0.1.1-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-7.0-py3.4.egg']

編輯2:

所以我也嘗試過使用 py2exe 並且遇到了同樣的問題。 如果我將包包含在“包含”中,我會得到以下回溯:

Traceback (most recent call last):
  File "setup.py", line 7, in <module>
    setup(windows=['DataViewer.py'], options={"py2exe": {"includes" :["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnal
ysis", "EphysTools"]}})
  File "C:\Anaconda3\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Anaconda3\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:\Anaconda3\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 188, in run
    self._run()
  File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 267, in _run
    builder.analyze()
  File "C:\Anaconda3\lib\site-packages\py2exe\runtime.py", line 164, in analyze
    mf.import_hook(modname)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 120, in import_hook
    module = self._gcd_import(name)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 274, in _gcd_import
    return self._find_and_load(name)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 318, in _find_and_load
    loader = importlib.find_loader(name, path)
  File "C:\Anaconda3\lib\importlib\__init__.py", line 87, in find_loader
    name=name)
ImportError: namespace packages do not have loaders

在這種情況下,我將我的兩個包(PrairieAnalysis 和 EphysTools)放入我的 site-packages 文件夾中。 為什么我的包裹與其他包裹的處理方式不同?

編輯 3:所以我使用以下設置腳本讓 py2exe 工作:

from distutils.core import setup
import py2exe
import PrairieAnalysis.pv_import
import EphysTools.utilities

includes = ["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnalysis", "EphysTools", "lxml._elementpath"]
packages = ["PrairieAnalysis", "EphysTools"]

setup(windows=['DataViewer.py'], options={"py2exe": {"includes" : includes,
                                                     "packages": packages}})

僅導入 PrairieAnalysis 和 EphysTools 並沒有奏效,也沒有做

from PrairieAnalysis import *
from EphysTools import *

但是,將這些導入語句添加到我的 cx_freeze setup.py 腳本並不能解決問題。

編輯4:

>>> import PrairieAnalysis
>>> print(PrairieAnalysis.__file__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
>>> print(PrairieAnalysis.__init__)
<method-wrapper '__init__' of module object at 0x0000000002B9C9F8>

編輯5:

>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages')
['.idea', 'EphysTools', 'PrairieAnalysis', '__init___.py']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\PrairieAnalysis')
['misc_code.py', 'pv_import.py', 'pxml_parse.py', '__init___.py', '__pycache__']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\EphysTools')
['synaptics.py', 'utilities.py', '__init___.py', '__pycache__']

您需要像在應用程序中一樣修改 setup.py 腳本中的sys.path cx_Freeze 查看 sys.path 以查找要包含在構建中的模塊和包,因此如果包含這些包的目錄不在 sys.path 上,則無法找到它們。

編輯:原來問題是一個錯誤命名的__init__.py文件。 該包仍可作為PEP 420命名空間包導入,但 cx_Freeze 尚不處理這些。

這對某人很有用,我遇到了同樣的問題,試圖添加我自己的模塊,所以最后,我做了如下:

在文件 setup.py 上:

from cx_Freeze import setup, Executable
files = {"include_files": ["folder/MyOwnModule1",
                       "folder/MyOwnModule2",
                       ], "packages": ["numpy", "tkinter"]}

setup(
 name="My Program",
 version="4.0.0",
 description="A super cool explanation",
 options={'build_exe': files},
 executables=[Executable("Version4.0.0/main.py", base=None)])

然后在終端上執行:

python setup.py build

我希望它有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM