我试图将一些数据写入%appdata%。一切似乎都像 Script1 的输出中所示的那样工作。正在创建新目录并保存文件,并且也成功检索数据。但尝试查看文件资源管理器中的数据时,该文件夹不存在! CMD也找不到文件和目录。
后来我手动创建了文件,检查了一下,发生了什么。 CMD 现在可以找到该文件(我刚刚手动创建),但是当尝试使用 python 读取该文件时,它会向我输出 python Ghost 文件内容
test data 123
,而不是我刚刚写入其中的内容! (我还用 WSL 仔细检查了新文件实际上包含
test data 456
)
- 发生了什么事?
- 我的 Windows 或 python 安装有问题吗?
- Python Ghost 版本在哪里正在存储的文件?
- 如何解决问题?
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