<p>您正在运行的Python二进制文件没有安装<code>torch</code>。它在模块搜索路径上有一个名为<code>torch</code>的目录,它被视为<a href="https://www.python.org/dev/peps/pep-0420/" rel="nofollow noreferrer">namespace package</a>:</p>
<pre><code>$ 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'])
</code></pre>
<p>在模块搜索路径中没有<code>__init__.py</code>文件的任何目录都将被视为命名空间,前提是在搜索路径的任何其他位置都找不到其他同名的Python模块或包。</p>
<p>这意味着,如果为Python二进制文件安装了<code>torch</code>,那么是否存在本地<code>torch</code>目录并不重要:</p>
<pre><code>$ 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']
</code></pre>
<p>上面显示,<code>sys.path</code>首先列出<code>torch</code>目录,然后是<code>additional_path/torch</code>,但是当您尝试导入时,后者将作为<code>torch</code>模块加载。这是因为在加载命名空间包之前,Python会优先考虑顶级模块和包。</p>
<p>您需要为当前的Python二进制文件正确安装torch,请参见<a href="http://pytorch.org/" rel="nofollow noreferrer">project homepage</a>;当使用<code>pip</code>时,您可能希望将Python二进制文件与<code>-m</code>开关一起使用:</p>
<pre><code>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
</code></pre>
<p>因此,用<code>python3.5 -m pip</code>替换主页指令<code>pip3</code>;<code>python3.5</code>也可以是Python二进制文件的完整路径。</p>
<p>请为最新版本使用正确的<code>download.pytorch.org</code>URL。</p>
<p>您不必将目录移到一边,但是如果您确实想并且不知道它的位置,请使用上面所示的<code>print(torch.__path__)</code>。</p>
<p>同样,请注意,如果在本地目录中有一个<code>__init__.py</code>文件,它将成为一个常规包,并将<code>pip</code>安装的包屏蔽到正常的<code>site-packages</code>位置。如果您有这样一个包,或者一个本地<code>torch.py</code>单文件模块,那么您需要重命名它们。在这种情况下,诊断信息看起来不同:</p>
<pre><code>$ 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
</code></pre>
<p>注意区别:上面的名称空间包使用<code><module 'name' (namespace)></code>,而常规包使用<code>)</code><code>, while a plain module uses</code>。</p>
<p>首先找到这样的包和模块(不是命名空间包),然后停止搜索。如果找到的包或模块不是您想要的包或模块,则需要将它们移到一边或重命名它们。</p>