python3 找不到我可以用 python2 导入的模块

Posted

技术标签:

【中文标题】python3 找不到我可以用 python2 导入的模块【英文标题】:python3 cannot find a module that I could import with python2 【发布时间】:2021-05-04 16:09:59 【问题描述】:

我正在尝试从 python2 切换到 python3。在此过程中,我还从 anaconda 切换到 miniconda3 作为我的主要包管理工具。我从 github 克隆了一些其他包。我发现我不能再从从 github 而不是 conda 下载的包中导入任何模块。例如,导入 linetools.utils 以前可以工作,现在不再工作。 import linetools.linetools.utils 有效,但这还不够,因为包内的各种模块相互引用。这个包不是我写的,所以将所有出现的 linetools.utils 更改为 linetools.linetools.utils 是不可取的。

这里有更多信息可以帮助您解决我的问题。

我的 $PYTHONPATH 环境变量设置为 /Users/lwymarie/python/。我也尝试将相同的路径放入我的 $path 变量。没有解决我的问题。

这是我在 PYTHONPATH 下的包。只显示一些。

flemish.local> ls $PYTHONPATH
sdsspy          Barak           desisim         linetools           desiutil        pymc3           specutils           PypeIt          pyqtgraph       statsmodels
RemoteObserving     fitsio          Ska.Numpy       ginga           redrock

这是我使用 python2 和 anaconda2 时的预期行为。我以包 linetools 为例。

flemish.local> python
Python 2.7.12 |Anaconda custom (x86_64)| (default, Jul  2 2016, 17:43:17) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import linetools.utils

这是上述工作时的 sys.path。仅显示一些元素。

>>> import sys
>>> sys.path
['', '/Users/lwymarie/python', '/Users/lwymarie/anaconda/lib/python27.zip', '/Users/lwymarie/anaconda/lib/python2.7', '/Users/lwymarie/anaconda/lib/python2.7/plat-darwin', '/Users/lwymarie/anaconda/lib/python2.7/plat-mac', '/Users/lwymarie/anaconda/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/lwymarie/anaconda/lib/python2.7/lib-tk', '/Users/lwymarie/anaconda/lib/python2.7/lib-old', '/Users/lwymarie/anaconda/lib/python2.7/lib-dynload', '/Users/lwymarie/anaconda/lib/python2.7/site-packages', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/PIL', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/Sphinx-1.3.1-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/aeosa', '/Users/lwymarie/python/specutils', '/Users/lwymarie/python/ginga', '/Users/lwymarie/python/statsmodels', '/Users/lwymarie/python/Ska.Numpy', '/Users/lwymarie/python/linetools', '/Users/lwymarie/python/pymc3', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/numpydoc-0.6.0-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/nbsphinx-0.2.9-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/recommonmark-0.4.0-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/CommonMark-0.5.4-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/joblib-0.10.2-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/Theano-0.8.2-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/ginga-2.7.0-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/QtPy-1.3.1-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/desiutil-1.9.9.dev596-py2.7.egg', '/Users/lwymarie/anaconda/lib/python2.7/site-packages/desisim-0.24.0.dev1308-py2.7.egg', '/Users/lwymarie/python/redrock/py', '/Users/lwymarie/python/PypeIt', '/Users/lwymarie/anaconda/lib/python2.7/site-packages']

退出 Python,这里是上述工作时的 $path 变量。

flemish.local> echo $path
/Users/lwymarie/anaconda/bin . /usr/local/bin /usr/local/etc /opt/local/bin /opt/local/sbin /usr/sbin /sbin /usr/bin /bin /usr/lang /etc /usr/etc /usr/X11/bin /usr/local/scisoft/bin /usr/local/texlive/2020/bin/x86_64-darwin /Library/Ruby/Gems/2.0.0 ./py/ ./

当我使用 python3 和 miniconda3 时,这是不需要的行为。

flemish.local> python
Python 3.7.4 (default, Aug 13 2019, 15:17:50) 
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import linetools.utils
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'linetools.utils'

这是发生上述错误时的 sys.path。我还尝试了 sys.path.append("/Users/lwymarie/python/linetools/") 技巧,但它仍然找不到模块。

>>> import sys
>>> sys.path
['', '/Users/lwymarie/python', '/Users/lwymarie/miniconda3/lib/python37.zip', '/Users/lwymarie/miniconda3/lib/python3.7', '/Users/lwymarie/miniconda3/lib/python3.7/lib-dynload', '/Users/lwymarie/miniconda3/lib/python3.7/site-packages']

退出 Python,这里是发生上述错误时的 $path 变量。

flemish.local> echo $path
/Users/lwymarie/miniconda3/bin /Users/lwymarie/miniconda3/bin . /usr/local/bin /usr/local/etc /opt/local/bin /opt/local/sbin /usr/sbin /sbin /usr/bin /bin /usr/lang /etc /usr/etc /usr/X11/bin /usr/local/scisoft/bin /usr/local/texlive/2020/bin/x86_64-darwin /Library/Ruby/Gems/2.0.0 ./py/ ./

这是 linetools 包的目录树的图像。

如果你成功帮助我让python3和linetools工作,你的善行将得到永生和幸福的回报。

【问题讨论】:

建立一个干净的环境,并在那里安装你需要的包 【参考方案1】:

在您的 python2 sys.path 中有 '/Users/lwymarie/python/linetools',但在您的 python3 sys.path 中没有。你用python3重新设置linetools了吗?

cd ~/python/linetools
python setup.py develop

【讨论】:

还要再考虑git pull源代码。当上帝知道 OP 何时首次安装它时,源本身可能不支持 Python 3...【参考方案2】:

我认为 Steven Lau 的建议应该可行。

但请记住,您有多个索引路径。你有 /Users/lwymarie/python 和 /Users/lwymarie/python/linetools (我在你的 py2 设置中看到了这个)。

【讨论】:

以上是关于python3 找不到我可以用 python2 导入的模块的主要内容,如果未能解决你的问题,请参考以下文章

python3中urllib2找不到怎么办

Ubuntu中找不到pip3命令的解决方法

DLL加载失败:找不到指定的模块

用wing IDE 总是提示找不到python,但是已经安装了。怎么回事

python3中使用python2中cmp函数出现错误

python2升级python3