您正在运行的 Python 二进制文件没有安装 torch。它确实在模块搜索路径上有一个名为torch的目录,它被视为namespace package:
$ 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 模块或包沿着搜索路径。
这意味着如果为您的 Python 二进制文件安装了torch,则本地是否存在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,请参阅project homepage;使用 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 # make it a package
$ 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 # make it a module
$ python3 -c 'import torch; print(torch); print(torch.__file__)'
<module 'torch' from '/some/path/torch.py'>
/some/path/torch.py
注意差异;上面的命名空间包使用<module 'name' (namespace)>,而常规包使用), while a plain module uses`。
首先找到此类包和模块(不是命名空间包)并停止搜索。如果找到的包或模块不是您想要的,您需要将它们移到一边或重命名。