[英]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.