Python cx_冻结模块依赖项

Python cx_冻结模块依赖项,python,cx-freeze,Python,Cx Freeze,因此,我的python脚本依赖于我创建的另一个模块。此模块读入文本文件。当我从源代码运行时,脚本、模块和它读取的文件通常都在同一个目录中,一切都很好 我使用cx_freeze编译,当我运行它时,导入的模块失败。模块试图读取该文件,但表示找不到该文件,所有操作都停止在那里 文本文件包含在library.zip中,构建文件夹可能是不必要的,但我认为这不会有什么坏处。我决定先打印模块中的工作目录,然后再读取文件以查看发生了什么,看起来工作目录不是build文件夹,而是我的用户主目录 当然,文本文件不在

因此,我的python脚本依赖于我创建的另一个模块。此模块读入文本文件。当我从源代码运行时,脚本、模块和它读取的文件通常都在同一个目录中,一切都很好

我使用cx_freeze编译,当我运行它时,导入的模块失败。模块试图读取该文件,但表示找不到该文件,所有操作都停止在那里

文本文件包含在library.zip中,构建文件夹可能是不必要的,但我认为这不会有什么坏处。我决定先打印模块中的工作目录,然后再读取文件以查看发生了什么,看起来工作目录不是build文件夹,而是我的用户主目录

当然,文本文件不在我用户的主目录中。我怎样才能解决这个问题

具体来说,这里有一个例子。所有文件都在同一目录中

script.py:

import hello
你好,派伊

import os
print(os.getcwd())
f = open('hello.txt','r')
print(f.read())
f.close()
hello.txt

hello!
setup.py

import sys
import os
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.

includes = ['hello.txt']
zip_inc = ['hello.txt']

build_exe_options = {"packages": ["os"], "include_files": includes, "zip_includes": zip_inc}

setup(  name = "test",
        version = "0.1",
        description = "test",
        options = {"build_exe": build_exe_options},
        executables = [Executable("script.py")])
我使用命令构建:

python setup.py build
然后我在build目录中运行了名为script的文件。如果重要的话,我会使用MacOSX。结果如下:

/Users/pianowow
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/cx_Freeze/initscripts/Console3.py", line 27, in <module>
    exec(code, m.__dict__)
  File "script.py", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1558, in _find_and_load
    return _find_and_load_unlocked(name, import_)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1525, in _find_and_load_unlocked
    loader.load_module(name)
  File "/Users/pianowow/Desktop/test/hello.py", line 3, in <module>
    f = open('hello.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'

我有一个更新文档的请求-下面是关于使用数据文件的更新部分:

应用程序通常需要代码以外的数据文件,如图标。使用安装脚本,您可以在include_files选项中列出数据文件或目录以生成_exe。它们将与可执行文件一起复制到构建目录。然后,要找到它们,请使用如下代码:

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)
另一种方法是在代码中嵌入数据,例如使用Qt的资源系统


我有一个更新文档的请求-下面是关于使用数据文件的更新部分:

应用程序通常需要代码以外的数据文件,如图标。使用安装脚本,您可以在include_files选项中列出数据文件或目录以生成_exe。它们将与可执行文件一起复制到构建目录。然后,要找到它们,请使用如下代码:

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)
另一种方法是在代码中嵌入数据,例如使用Qt的资源系统


这看起来是一个解决多个工作目录问题的好办法。您是否了解为什么会出现这种情况?一般来说,程序启动时不应假定工作目录始终位于同一位置。即使使用常规的未冻结Python脚本,您也可以轻松地使用不同的工作目录启动它?在我的例子中,我想使用jsonschema模块进行构建,但我找不到如何1获取.json文件并将其放入构建中,2确保可执行文件能够找到它们。。。谢谢目前,如果外部软件包使用数据文件,您通常必须修补其查找数据文件的方式。我有一个针对cx\u Freeze的拉取请求,这将有助于解决这个问题,而且我已经提出了一个请求,它不会受到这个问题的影响。您是否了解为什么会出现这种情况?一般来说,程序启动时不应假定工作目录始终位于同一位置。即使使用常规的未冻结Python脚本,您也可以轻松地使用不同的工作目录启动它?在我的例子中,我想使用jsonschema模块进行构建,但我找不到如何1获取.json文件并将其放入构建中,2确保可执行文件能够找到它们。。。谢谢目前,如果外部软件包使用数据文件,您通常必须修补其查找数据文件的方式。我有一个针对cx_Freeze的拉取请求,这将有助于解决此问题,并且我已经提出了一个请求,该请求不会受到此问题的影响。