你正在运行的Python二进制文件中没有安装
torch
。它确实有一个名为
torch
的目录位于模块搜索路径上,并被视为
命名空间包:
$ pwd
/some/path
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
$ mkdir torch
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' (namespace)>
_NamespacePath(['/some/path/torch'])
在你的模块搜索路径上,任何没有 __init__.py
文件的目录都将被视为命名空间,前提是没有其他同名的 Python 模块或包在搜索路径上的其他位置。
这意味着,如果 torch
被安装到你的 Python 二进制文件中,那么本地是否有 torch
目录并不重要:
$ ls -ld torch/
drwxr-xr-x 2 mjpieters users 68 Nov 23 13:57 torch/
$ mkdir -p additional_path/torch/
$ touch additional_path/torch/__init__.py
$ PYTHONPATH="./additional_path" python3 -c 'import os.path as p, sys; print(*(t for t in (p.join(e, "torch") for e in sys.path) if p.exists(t)), sep="\n")'
torch
/some/path/additional_path/torch
$ PYTHONPATH="./additional_path" python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' from '/some/path/additional_path/torch/__init__.py'>
['/some/path/additional_path/torch']
上述内容表明
sys.path
列出了
torch
目录,其次是
additional_path/torch
,但当您尝试导入它时,后者作为
torch
模块被加载。这是因为 Python 在加载命名空间包之前会优先考虑顶层模块和包。
您需要正确安装适用于当前 Python 二进制文件的 torch,请参见
项目主页;使用
pip
时,您可能需要使用带有
-m
开关的 Python 二进制文件:
python3.5 -m pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl
python3.5 -m pip install torchvision
所以将主页指令中使用的pip3
替换为python3.5 -m pip
;python3.5
也可以是您的Python二进制文件的完整路径。
请使用正确的download.pytorch.org
URL获取最新版本。
您不必移动目录,但如果您确实想要移动并且不知道它的位置,请像我上面展示的那样使用print(torch.__path__)
。
再次注意,如果您在本地的torch
目录中有一个__init__.py
文件,则它将变成一个常规包,并且它会掩盖由pip
安装到正常的site-packages
位置的包。如果您有这样的包,或者本地的torch.py
单个文件模块,则需要将其重命名。在这种情况下,诊断信息看起来不同:
$ pwd
/some/path
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
$ mkdir torch
$ touch torch/__init__.py
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' from '/some/path/torch/__init__.py'>
['/some/path/torch']
$ rm -rf torch/
$ touch torch.py
$ python3 -c 'import torch; print(torch); print(torch.__file__)'
<module 'torch' from '/some/path/torch.py'>
/some/path/torch.py
请注意区别:上面的命名空间包使用
<module 'name' (namespace)>
,而常规包使用
)
,普通模块使用
`.
这样的包和模块(不是命名空间包)首先被找到并停止搜索。如果找到的包或模块不是您想要的,您需要将它们移开或重命名。
>>> torch <module 'torch' (namespace)>
- DavideChicco.it'/home/davide/torch'
。 - DavideChicco.it/home/davide/torch
重命名为其他名称,然后再试一次。它可能会干扰原始的torch软件包。 - Tarun Lalwani