我有一个python项目(我在virtualenv中运行),其结构如下:
Project
├───.git
├───venv
└───src
├───__init__.py
├───mymodules
│ ├───__init__.py
│ ├───module1.py
│ └───module2.py
└───scripts
├───__init__.py
└───script.py
script.py
import src.mymodules.module1
...
我使用以下命令从venv激活运行项目,并从Project目录中运行该项目:
(venv)$ python src/scripts/script.py
该脚本会运行,但是在退出之前会发出以下错误:
Traceback (most recent call last):
File "src/scripts/script.py", line 1, in <module>
import src.mymodules.module1
ImportError: No module named src.mymodules.module1
我试过运行python shell并尝试从那里导入模块,但没有出错。我在src的每个目录中都有_ _init__.py。python是否将工作目录视为src
/ scripts?为什么会发生这种情况?如果是这种情况,如何使src成为工作目录?
本质上,当您script.py
直接执行时,它不知道它是的子模块的一部分src
,也不知道命名的模块src
可能在哪里。在python
2或3中就是这种情况。
如您所知,Python根据的内容查找模块sys.path
。为了导入任何模块,它必须位于中列出的目录中sys.path
,或者与您正在运行的脚本位于同一目录中。
当您说时python src/scripts/script.py
,请sys.path
包含Project/src/scripts/
(因为script.py
位于此处),但不包含Project
。由于Project
不在路径中,因此src
无法导入该目录()中的模块。
要解决此问题:
我假设您script.py
是src
模块的入口点(例如,也许是主程序)。如果是这样,那么您可以script.py
向上移动至与以下级别相同的级别来进行修复src
:
Project
├───.git
├───venv
|───script.py <--- script.py moves up here
└───src
├───__init__.py
└───mymodules
├───__init__.py
├───module1.py
└───module2.py
这样,script.py
就可以自由地导入任何内容src
,但是insrc
中什么也不能导入script.py
。
如果不是这种情况,并且script.py
确实是的一部分src
,则可以使用python的-m
参数script.py
作为src
模块的一部分执行,如下所示:
$ python -m src.scripts.script
因为您已经告诉python您正在运行哪个模块(src
),所以它将位于路径中。因此,请script.py
注意,它是的子模块src
,然后可以从导入src
。
在这种情况下,虽然小心-有可能创造一个圆形的进口,如果事情在src
进口src.scripts.script
。
作为这两种方法的替代,您可以sys.path
直接在中修改script.py
:
import sys
sys.path.insert(0, '/path/to/Project') # location of src
尽管此方法有效,但通常不是我的偏好。它需要script.py
确切地知道代码的布局方式,并且如果另一个python程序尝试导入,可能会导致导入混乱script.py
。
问题内容: 我是Python的初学者。在开始之前,这是我的Python文件夹结构 在下面,我有一个名为的文件夹,其中有一个Python文件,其内容如下: 接下来,我位于文件夹中,位于上一级: 每当我运行它都会导致错误 我有什么想念的吗? 问题答案: Python中的所有模块都必须具有特定的目录结构。您可以在此处找到详细信息。 在目录下创建一个空文件,使您的目录结构如下所示: 同样在文件中,将imp
问题内容: 我最近在计算机上安装了cx_Oracle模块,以连接到远程Oracle数据库服务器。(我身边没有Oracle客户端)。 Python:2.7 x86版 Oracle:版本11.1.X x64 Cx_Oracle:版本5.1.2-11g.win32-py2.7 然后,每次我运行脚本时,脚本都会失败并显示以下消息: ImportError:DLL加载失败:找不到指定的模块。 我想知道是否我
问题内容: 我是EAR的新手。我已经开发了一个功能相互依赖的Web模块和ejb模块。为此,我试图将它们配置在EAR中。我将web和ejb模块都映射到EAR,可以看到application.xml为 但是当我尝试执行EAR时,我的服务器抛出以下异常 从上面我可以理解,EAR无法定位EJB模块中存在的类,因此引发异常。我正在使用WildFLy 10服务器和Eclipse IDE。 问题答案: EAR文
但是当我尝试执行EAR时,我的服务器抛出异常 从上面我可以理解的是,EAR无法定位EJB模块中存在的类,因此抛出异常。我使用的是Wildfly10服务器和eclipse IDE。
已安装Python 3.7.6并尝试在Visual Studio Code中编写代码 使用: 获取ModuleNotFoundError的错误:没有名为“pikepdf”的模块 但是,我运行“pip install pikepdf”,得到: 已满足要求:c:\users\ME\appdata\local\packages\pythonsoftwarefoundation中的pikepdf。蟒蛇3.
问题内容: 大家好,我只是在学习烧瓶。我用pip来安装它。然后,当我运行此基本代码时,我得到一个错误。基本上,我看到它的工作,然后突然退出,并出现以下错误。这可能看起来是一些环境问题,但我不确定。前几天这很奇怪,现在却行不通。 问题答案: 您说过,仅当您从交互式shell运行代码时,才会出现此问题。它是由(wsgi服务器所基于的)功能引起的。 如果更改了项目文件,则在调试模式下将自动重新启动服务器