首页 > 编程问答 >在 python 中写入 %appdata% 时出现奇怪的行为

在 python 中写入 %appdata% 时出现奇怪的行为

时间:2024-07-20 22:20:04浏览次数:14  
标签:python windows-10

我试图将一些数据写入%appdata%。一切似乎都像 Script1 的输出中所示的那样工作。正在创建新目录并保存文件,并且也成功检索数据。但尝试查看文件资源管理器中的数据时,该文件夹不存在! CMD也找不到文件和目录。

后来我手动创建了文件,检查了一下,发生了什么。 CMD 现在可以找到该文件(我刚刚手动创建),但是当尝试使用 python 读取该文件时,它会向我输出 python Ghost 文件内容 test data 123 ,而不是我刚刚写入其中的内容! (我还用 WSL 仔细检查了新文件实际上包含 test data 456

  1. 发生了什么事?
  2. 我的 Windows 或 python 安装有问题吗?
  3. Python Ghost 版本在哪里正在存储的文件?
  4. 如何解决问题?

Script1(使用 test data 123 创建文件):

import os
import subprocess


appdata        = os.getenv('APPDATA')
directory_path = f"{appdata}\\com-company\\prod-product-version3"
file_path      = directory_path + "\\file1.txt"


print(f"Directories Exist: {os.path.exists(directory_path)}")
if not os.path.exists(directory_path):
    os.makedirs(directory_path)
    print("Directories created")
print(f"Directories Exist: {os.path.exists(directory_path)}")



print(f"File Exist: {os.path.exists(file_path)}")
print(f"Writing File: {file_path}")
with open(file_path, 'w')as fp:
    fp.write("test data 123")
print(f"File Exist: {os.path.exists(file_path)}")


print(f"Reading File: {file_path}")
with open(file_path, 'r')as fp:
    print(f"File Content: {fp.read()}")



print('---------------------')
cmd = f"dir {directory_path}"
try:
    output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, text=True)
    print(output)
except subprocess.CalledProcessError as e:
    print(f'Error: {e}')
    print(f'Error message:\n{e.output}')


print('---------------------')
cmd = f"dir {file_path}"
try:
    output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, text=True)
    print(output)
except subprocess.CalledProcessError as e:
    print(f'Error: {e}')
    print(f'Error message:\n{e.output}')

输出:

Directories Exist: False
Directories created
Directories Exist: True
File Exist: False
Writing File: C:\Users\one\AppData\Roaming\com-company\prod-product-version3\file1.txt
File Exist: True
Reading File: C:\Users\one\AppData\Roaming\com-company\prod-product-version3\file1.txt
File Content: test data 123
---------------------
Error: Command 'dir C:\Users\one\AppData\Roaming\com-company\prod-product-version3' returned non-zero exit status 1.
Error message:
The system cannot find the file specified.

---------------------
Error: Command 'dir C:\Users\one\AppData\Roaming\com-company\prod-product-version3\file1.txt' returned non-zero exit status 1.
Error message:
The system cannot find the path specified.

手动创建 C:\Users\one\AppData\Roaming\com-company\prod-product-version3\file1.txt 手动创建并向其中写入数据:

test data 456

Script2(读取 test data 123 ,即使它包含 test data 456 ):

import os
appdata        = os.getenv('APPDATA')
directory_path = f"{appdata}\\com-company\\prod-product-version3"
file_path      = directory_path + "\\file1.txt"

print(f"File Exist: {os.path.exists(file_path)}")

print(f"Reading File: {file_path}")
with open(file_path, 'r')as fp:
    print(f"File Content: {fp.read()}")

输出:

File Exist: True
Reading File: C:\Users\one\AppData\Roaming\com-company\prod-product-version3\file1.txt
File Content: test data 123

使用WSL进行双重检查:

cat /mnt/c/Users/one/AppData/Roaming/com-company/prod-product-version3/file1.txt
Output: test data 456

PS: 我重新启动了系统,python 仍然认为该文件包含 test data 123 正常情况下,写作就可以了:

with open('C:\\Users\\one\\Desktop\\file2.txt', 'w') as fp:
    fp.write('test data 789')

遇到的问题与文件系统重定向有关,该问题特别影响 Windows 中的 %appdata%(或 %localappdata%)文件夹。简而言之,的 Python 进程正在访问该文件夹的不同“视图”,而不是在文件资源管理器或 CMD 中看到的位置。

以下是发生的情况以及解决方法的详细说明:

发生了什么事?

  • 文件系统重定向: Windows 具有一个称为文件系统重定向的功能,该功能允许应用程序将文件存储在 %appdata% 的每个用户位置,同时将它们重定向到其他位置。这样做是为了各种目的,包括应用程序兼容性和用户配置文件管理。当 32 位应用程序在 64 位 Windows 版本上运行时,通常会发生看到的那种特定重定向形式。的 Python 安装(或使用的特定 Python 库)可能是 32 位的,因此会受到影响。
  • 不同的“视图”: 基本上,的 32 位 Python 进程看到的是 %appdata% 的重定向版本,而的文件资源管理器和 CMD(可能以 64 位进程运行)则看到的是非重定向版本。这就是为什么在这些不同环境中看到不同文件内容的原因。

如何解决问题?

  • 使用 sys.executable 确定 Python 解释器的位数:

python import sys print(sys.executable)

如果路径包含 Program Files (x86) ,则表示正在运行 32 位版本的 Python。

  • 如果可能,请切换到 64 位 Python: 如果可以控制正在使用的 Python 版本,请考虑切换到 64 位 Python 安装。这通常可以解决文件系统重定向问题。

  • 使用原始路径: 避免隐式依赖 %appdata%。可以使用以下方法构造指向所需位置的完整、非重定向路径:

python import os base_path = os.path.join(os.getenv('LOCALAPPDATA'), 'com-company', 'prod-product-version3') file_path = os.path.join(base_path, 'file1.txt')

  • 使用 Win32 API(如果绝对必要): 对于更复杂的情况,可以直接使用 Win32 API 函数(例如 CreateFileW 并使用适当的标志)来控制文件访问和重定向。但是,这需要更高级的 Windows 编程知识。

通过应用这些解决方案,可以确保的 Python 代码始终一致地写入和读取正确的位置,而不受文件系统重定向的影响。

标签:python,windows-10
From: 76014099

相关文章

  • 使用 selenium 在 python 中打开 chrome 中的链接
    通过此链接https://bancadatistatisticaoas.inail.it/analytics/saw.dll?Dashboard&PortalPath=%2Fshared%2FBDS%2F_portal%2FINF_Definiti_Industria_e_Servizi我需要单击“FCostruzioni”,然后单击F41COSTRUZIONIED埃迪菲西。这是我的代码,但它不起作用。我做错了......
  • 七大排序算法的Python实现
    七大排序算法的Python实现1.冒泡排序(BubbleSort)算法思想冒泡排序通过重复交换相邻的未按顺序排列的元素来排序数组。每次迭代都将最大的元素“冒泡”到数组的末尾。复杂度分析时间复杂度:O(n^2)空间复杂度:O(1)defbubble_sort(arr):n=len(arr)for......
  • python反序列化
    之前hgame中遇到python反序列化,这次正好借分享会来尽可能详细学习一下python反序列化基础知识什么是序列化?反序列化?在很多时候为了方便对象传输,我们往往会把一些内容转化成更方便存储、传输的形式。我们把“对象->字符串”的翻译过程称为“序列化”;相应地,把“字符串->对......
  • 我在 python 项目中不断收到“无法识别图像文件中的数据”错误
    我正在尝试向我的TK窗口添加一个图标,但我不断收到一条错误消息:Traceback(mostrecentcalllast):File"C:\Users\roger\source\repos\PythonApplication\PythonApplication.py",line7,in<module>windowIcon=tk.PhotoImage(file="C:/Users/roger/Downloa......
  • Python学习笔记41:游戏篇之外星人入侵(二)
    前言在上一篇文章,我们已经创建好了项目目录,在今天,我们主要编写入口模块的功能。mainmain.py模块是我们游戏程序的入口,所有我们需要在模块中编写游戏主启动以及主页面相关的代码。当前我们的main模块是这样的,这是我们创建项目时默认生成一些代码,接下来我们就要进行我们......
  • Python学习笔记39:进阶篇(二十八)pygame的使用之按键映射及按键失效问题解决
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记40:游戏篇之外星人入侵(一)
    前言入门知识已经学完,常用标准库也了解了,pygame入门知识也学了,那么开始尝试小游戏的开发。当然这个小游戏属于比较简单的小游戏,复杂的游戏需要长时间的编写累计开发经验,同时也需要一定的时间才能编写出来。现在的话还是嫩了点。从基础的简单的开始,学习实践,慢慢的成长才......
  • Python学习笔记37:进阶篇(二十六)pygame的使用之输入处理
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 音频文件降噪及python示例
    操作系统:Windows10_x64Python版本:3.9.2noisereduce版本:3.0.2从事音频相关工作,大概率会碰到降噪问题,今天整理下之前学习音频文件降噪的笔记,并提供Audacity和python示例。我将从以下几个方面展开:noisereduce库介绍使用Audacity进行降噪使用fft滤波降噪使用noisereduce进......