【发布时间】:2021-12-26 22:57:09
【问题描述】:
我遇到的最初问题是 pip 无法安装 tensorflow lib 由于
Windows MAX_PATH 限制为 260 个字符。这是我收到的消息:
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory:
'C:\\Users\\Root\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\
local-packages\\Python39\\site-packages\\tensorflow\\include\\external\\com_github_grpc_grpc\\
src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.h'
HINT: This error might have occurred since this system does not have Windows Long Path support enabled.
You can find information on how to enable this at https://pip.pypa.io/warnings/enable-long-paths
我查看了pip 建议的提示页面。这链接到 Microsoft 文档页面,该页面解释了可以通过将 REG_DWORD 注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled 设置为 1 来解除限制。
在对注册表项进行修改后,我重新启动系统并尝试再次安装tensorflow。它没有用 - 我收到了同样的错误信息。然后我回到微软文档页面,发现LongPathsEnabled 选项也可以通过组策略编辑器(又名gpedit.msc)激活。在那里,我直接去了Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths,并将策略设置为Enabled(最初是Not Configured,尽管设置了注册表项)。然后我再次重新启动我的电脑,打开cmd 并再次输入pip install tensorflow。收到相同的错误消息。
这就是事情开始变得有趣的地方:我发现LongPathsEnables 选项似乎根本不适用于我的PC。以下是 Microsoft 文档所说的:
如果您选择启用长路径行为,这些文件管理功能将不再有 MAX_PATH 限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2...
于是我打开了 Visual Studio 并编写了这段代码:
int main(int argc, char ** argv)
{
HANDLE fileHandle = CreateFile2(
L"C:\\Users\\Root\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python39\\site-packages\\tensorflow\\include\\external\\com_github_grpc_grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.h",
GENERIC_ALL,
0,
CREATE_ALWAYS,
NULL
);
if (fileHandle == INVALID_HANDLE_VALUE)
{
DWORD error = GetLastError();
cout << "CreateFile2 failed with LastError code: " << error << endl;
}
else
{
cout << "Success" << endl;
}
getchar();
return 0;
}
这失败了 GetLastError() 代码 3(ERROR_PATH_NOT_FOUND - 系统找不到指定的路径)。需要注意的是,当我将路径缩短到 C:\\Users\\Root\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python39\\site-packages\\tensorflow\\include\\external\\com_github_grpc_grpc\\src\\core\\ext\\filters\\client_channel\\client_load_reporting_filter.h 导致 252 个字符长的路径时,它成功了,所以我推断 CreateFile2 似乎也没有确定 LongPathsEnabled 选项正在设置。 C++ 程序问题的原因可能是在其应用程序清单中应该有一个 longPathsAware 元素设置为 true(这在我上面提到的同一个 Microsoft 文档页面中说明),但我没有'不知道如何设置此选项,因为它应该在设置注册表项并重新启动我的电脑后立即工作。我记得大约半年前,我在之前的 Windows 10 安装中遇到了同样的问题,并且非常容易修复 - LongPathsEnabled 设置为 1,PC 重新启动,pip install <some-package> 成功。这个答案:Filename too long in Git for Windows 暗示某些程序默认禁用 Long Paths 功能,但我不知道是否是这种情况,即使是这种情况,如何为pip 设置它。顺便说一句,pip config set <name> <value> 失败,因为pip.ini 文件无法写入(在PID: 0 中打开)。
尝试手动创建文件(client_load_reporting_filter.h),从互联网上复制原始内容,但也无济于事。当我在我的notepad++ 中打开它时,路径字符串是C:\Users\Root\AppData\Local\Packages\PYTHON~1.9_Q\LOCALC~1\LOCAL-~1\Python39\SITE-P~1\TE1A26~1\include\external\COM_GI~1\src\core\ext\filters\CLIENT~1\LB_POL~1\grpclb\CLIENT~1.H 所以notepad++ 似乎也无法使用长路径。
我现在完全一无所知和绝望,所以我决定在这里问一个问题,希望有人经历过这种情况并且可能能够提供帮助。如果问题可以在不重新安装 Windows 的情况下解决,我会很高兴,但这一切看起来很奇怪。
【问题讨论】:
-
不幸的是,可以解除限制,但如果文件名超过 MAX_PATH,许多程序仍然无法在 Windows 中正常运行。关于您的 C++ 代码 - 根据文档,行为会因您的 Windows 版本而异。您可能还需要转义反斜杠。
-
@RyanPepper 谢谢你的澄清。我将python降级到3.7版,
tensorflow安装成功。 -
这应该是一个错误或者你做错了什么。如果 MSDN 说
CreateFile2()支持具有上述设置的长文件,根据我的经验,这通常是可以信任的。您是否尝试过查找现有的错误通知单或自己提交错误通知单? -
@UlrichEckhardt 还没有,有没有合适的方法来归档,考虑我的系统设置或其他一些重要的东西?
标签: python c++ windows pip group-policy