为什么 Python 脚本在尝试打开文件时意外退出,但只有在作为 Python 可执行文件双击时才会意外退出?

问题描述 投票:0回答:1

我的用例 99.9% 的时间是为自己编写脚本并从终端运行它们,所以这是我第一次遇到这种情况。但我确信它有一个超级基本/直接的解决方案。考虑以下 helloworld.py 脚本:


print("hello world!")

file = open("test.txt","r")

x = input()

当我尝试双击该脚本作为 Python 可执行文件运行时,它会意外退出。我在 Windows 11 上使用 Python 3.12.3。它闪烁得太快,以至于我不知道是否显示错误消息。

此脚本就像终端中的魅力一样运行,使用

python helloworld.py

并且也按预期从 IDLE 运行。文件 test.txt 已存在于该脚本所在的目录中。

我知道它退出了,因为它没有到达

input()
线来挂起。如果打开命令被注释掉,脚本也会通过双击按预期运行,并在
input()
处暂停。所以尝试打开就是问题所在。

这对我来说并不是真正的问题,但在我当前的用例中,我想为非编码人员制作易于使用的可执行文件,因此让他们从终端运行 Python 脚本确实是他们的工作流程不可行。更一般地说,这个问题对我来说毫无意义,我真的很想理解它。

python
1个回答
1
投票

问题是双击Python文件并没有使用该文件的目录作为工作目录。 (我很确定它默认为 Windows 上的主目录。)

您应该做的是读取

test.txt
文件,其路径相对于您正在执行的 Python 脚本。这可以通过 Python 的
pathlib
模块和全局
__file__
变量轻松实现:

import pathlib

print("hello world!")

with open(pathlib.Path(__file__).parent / "test.txt") as file:
    ...

x = input()

并不是说我还通过

上下文管理器
使用open,因为无论是否发生任何异常,文件都会在
with
块结束后自动关闭。

也不是说

'r'
open
的默认模式,因此传递该参数是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.