【问题标题】:Python script not writing on files after cx_Freeze在 cx_Freeze 之后 Python 脚本未写入文件
【发布时间】:2023-04-02 10:19:02
【问题描述】:

我正在编写一个打算用 cx_Freeze 冻结的脚本。我正在使用 Python 3.6 和 cx_Freeze 5.1.1。

我目前面临的问题是,我的 Python 脚本——完美地作为 .py 工作——一旦被 cx_Freeze 冻结,确实读取了 text.txt 文件的内容,但似乎无法在上面写入。

我已经编写了我正在尝试做的简化版本,但问题仍然存在。

这是我的main.py

from tkinter import *

def writing():
    word = str(word_field.get())
    ft = open('text.txt', 'w')
    ft.write(word)
    ft.close()

def from_file():
    ft = open('text.txt', 'r')
    string = ''
    for line in ft:
        line = line.strip()
        string = string+line
    ft.close()

    root2 = Tk()
    result = Label(root2, text=string)
    result.grid(row=1, column=1)
    root2.mainloop()

 root = Tk()
 root.title('My window')
 word_field = Entry(root)
 btn_1 = Button(root, text='Read', command=from_file)
 btn_2 = Button(root, text='Write', command=writing)

 word_field.grid(row=1, column=1, columnspan=2)
 btn_1.grid(row=2, column=1)
 btn_2.grid(row=2, column=2)

 root.mainloop()

这是我用于 cx_Freeze 的 setup.py

from cx_Freeze import setup, Executable
import os.path

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

setup(
    name = "Prova",
    version = "1.0.0",
    options = {"build_exe": {
            'packages': ["tkinter"],
            'include_files' : [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), \
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), 'text.txt'],
            'include_msvcr': True,
            }},
        executables = [Executable("main.py", base="Win32GUI")]
        )

知道它为什么会这样吗? 提前谢谢你!

【问题讨论】:

  • 我刚刚尝试了您的脚本,它可以正常工作。我编译并且它也工作了。你怎么了?
  • 嗨西蒙,我面临的问题是,使用冻结的脚本,我可以读取文件的内容,但不能在上面写字。如果您说它对您有用,我想问题可能出在其他地方。由于我现在很好奇,我试图将它安装在另一台机器上,但它也不起作用。所以问题可能不在于脚本的编写方式,而在于冻结过程。有什么建议吗?
  • Ping 下次你想和某人交谈时(@Simon)我会早点回复,因为我知道你已经回复了(我只收到这条消息,因为我刚好在看这里)。是的,当我按下读取时,它读取一行,当我写入时,它写入我输入的行。我需要更多信息。操作系统版本是什么,错误回溯(这是您提到的另一台机器)。您确定从 CLI 运行时没有错误吗?
  • 这可能值得一试,但老实说,我以前从未听说过这样的事情。
  • 嗨@Simon,第一个信息(我使用的是 Python 3.6、Cx_Freeze 5.1.1、Win7 64 位)。当我在冻结之前测试脚本时,我一直在终端上查看并且没有错误或回溯,它可以正常工作。在我冻结它之后,单击按钮 1 它会读取文件的内容,但是如果我在输入字段中写入并单击按钮 2,它似乎没有任何效果,文件根本没有改变。我什至尝试安装以将其冻结在另一台电脑上,但它也不起作用。我的想法不多了...

标签: python cx-freeze


【解决方案1】:

关于这个问题的更新:经过大量不同的配置(我什至尝试使用 PyInstaller 而不是 cx_Freeze),结果发现问题不在于脚本或冻结过程本身,而在于事实上,由于可执行文件需要写入文件,这与赋予可执行文件的权限相冲突。

这意味着可执行文件无法写入文件,程序停止但不生成错误消息(甚至在 cmd 窗口中运行它)。 我将创建一个新的专门问题,然后在此处发布该问题的链接。

【讨论】:

    【解决方案2】:

    我知道这个帖子两年前就死了,但由于我遇到了同样的问题,而且我认为很难找到解决方案,所以我还是会在这里写一些东西

    对我来说,问题是 .exe 所在的文件夹。它位于一个随机文件夹中,因此它没有写入文件的权限。
    我通过将构建移动到 \Appdata\Roaming 文件夹解决了这个问题。执行此操作后,程序运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2014-04-08
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多