【问题标题】:Python script with open('filename') works with IDLE but doesn't work in console带有 open('filename') 的 Python 脚本适用于 IDLE,但不适用于控制台
【发布时间】:2016-08-02 01:57:16
【问题描述】:

我正在尝试在 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(r'C:\Users\henrique\Documents\Programas\Python\Keylogger\teste27.txt', 'a')

标签: python python-2.7 file console python-idle


【解决方案1】:

为了对其他人有所帮助,问题中的问题需要解释。带有相对路径的“open(filepath)”,例如“something.txt”,将打开相对于“当前工作目录”的文件。对于简单的文件名,这意味着在当前工作目录 (CWD) 中。

IDLE 在编辑器中运行代码时,会将运行代码的新进程的当前工作目录作为代码所在的目录。 (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 的正在运行的程序。对于大多数控制台,默认提示包括 CWD。当您从控制台运行程序时,它将继承 CWD amd 与该 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)' 就会如你所愿。

【讨论】:

  • 没错,该文件是在默认控制台的 CWD“C:\Users\henrique”中创建的。我不知道这些正斜杠,谢谢提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2013-02-02
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多