我正在尝试运行一个脚本,该脚本除其他外将启动python脚本。我收到一个ImportError:没有名为...的模块,但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则该模块将被接受。
怎么回事,我该如何解决?我试图了解python如何使用PYTHONPATH,但是我感到非常困惑。任何帮助将不胜感激。
-v
选项启动python,然后您会看到python在(或没有)找到您要导入的模块的位置。
我正在尝试运行一个脚本,该脚本除其他外将启动python脚本。我收到一个ImportError:没有名为...的模块,但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则该模块将被接受。
怎么回事,我该如何解决?我试图了解python如何使用PYTHONPATH,但是我感到非常困惑。任何帮助将不胜感激。
-v
选项启动python,然后您会看到python在(或没有)找到您要导入的模块的位置。
Answers:
由于命令行IPython解释器使用当前路径的方式与单独进程(例如IPython笔记本,外部进程等)的方式不同,因此会出现此问题。IPython将寻找要导入的模块,这些模块不仅可以在sys.path中找到,而且可以在当前工作目录中找到。从命令行启动解释器时,您正在操作的当前目录与在ipython中启动的目录相同。如果运行
import os
os.getcwd()
您会看到这是真的。
但是,假设您使用的是ipython笔记本,请运行,os.getcwd()
而当前的工作目录是您告诉笔记本在ipython_notebook_config.py文件中操作笔记本的文件夹(通常使用该c.NotebookManager.notebook_dir
设置)。
解决方案是为python解释器提供您的模块路径。最简单的解决方案是将该路径附加到sys.path列表中。在您的笔记本中,首先尝试:
import sys
sys.path.append('my/path/to/module/folder')
import module-of-interest
如果这不起作用,则您手上的问题与导入路径无关,您应提供有关问题的更多信息。
解决此问题的更好(且更永久)的方法是设置PYTHONPATH,它为解释器提供了用于python包/模块的其他目录。将PYTHONPATH编辑或设置为全局变量是os依赖的,这里将在Unix或Windows上进行详细讨论。
__init_.py
,对吗?......并没有打算要修改PYTHONPATH
,也没有电话sys.path.append
,即使他们也正确(正确吗?)。我的意思是,我在其中包含数十个带有代码的目录,并且我不会将它们全部添加到路径中,也不会期望其他用户访问其jupyter配置文件,即使它是一个目录也是如此。
在__init__.py
运行python项目时,只需在显示错误的文件夹下创建一个名称为空的python文件即可。
foo.ipynb
使用bar/baz.py
,添加空bar/__init__.py
文件,以便笔记本可以使用from bar.baz import MyClass
确保它们都使用相同的解释器。这在Ubuntu上发生在我身上:
$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]
$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]
而且sys.path
是两个解释不同。为了解决这个问题,我删除了Python 3.3。
pip install --upgrade ipython
以获取最新版本,然后默认情况下它将自动使用2.7.11。
import sys; sys.version
主要原因是Python和IPython的sys.paths不同。
请参考lucypark链接,该解决方案适用于我的情况。它通过安装opencv时发生
conda install opencv
在iPython中出现导入错误,有三个步骤可以解决此问题:
import cv2
ImportError: ...
1.使用以下命令检查Python和iPython中的路径
import sys
sys.path
您会发现与Python和Jupyter不同的结果。第二步,只需使用sys.path.append
尝试错误即可修复错过的路径。
2.临时解决方案
在iPython中:
import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2
该ImportError:..
问题的解决
3.永久解决方案
创建一个iPython配置文件并设置初始追加:
在bash shell中:
ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py
在vi中,附加到文件:
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]
完成
这样做是sys.path.append('my-path-to-module-folder')
可行的,但是为了避免每次要使用IMod时都必须在IPython中执行此操作,可以将其添加export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
到~/.bash_profile
文件中。
如果从命令行运行它,有时python解释器将不知道在何处查找模块。
下面是我的项目的目录结构:
/project/apps/..
/project/tests/..
我在以下命令下运行:
>> cd project
>> python tests/my_test.py
运行以上命令后,出现以下错误
no module named lib
lib已导入my_test.py
我打印了sys.path并发现我正在处理的项目的路径在sys.path列表中不可用
我在脚本的开头添加了以下代码my_test.py
。
import sys
import os
module_path = os.path.abspath(os.getcwd())
if module_path not in sys.path:
sys.path.append(module_path)
我不确定这是否是解决问题的好方法,但是是的,它确实对我有用。
os.getcwd()
会获得运行脚本的目录,而不是脚本文件所在的目录。
我发现此问题的解决方案已在此处广泛记录:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
基本上,您必须在Jupyter环境中安装软件包,并发出如下shell命令:
!{sys.executable} -m pip install numpy
请检查上面的链接以获得权威的完整答案。
该答案适用于此问题,如果
下面的路径可以是相对的
PYTHONPATH=/path/to/dir python script.py