我的用例 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文件并没有使用该文件的目录作为工作目录。 (我很确定它默认为 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
的默认模式,因此传递该参数是多余的。