- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 python 项目(我在 virtualenv 中运行),它具有以下结构:
Project
├───.git
├───venv
└───src
├───__init__.py
├───mymodules
│ ├───__init__.py
│ ├───module1.py
│ └───module2.py
└───scripts
├───__init__.py
└───script.py
脚本.py
import src.mymodules.module1
...
我在激活 venv 的情况下使用以下命令从项目目录运行项目:
(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
中的任何东西,而src
中的任何东西都不能导入script.py
。
如果不是这样,并且 script.py
确实是 src
的一部分,则可以使用 python 的 -m
作为 src
模块的一部分执行 script.py
的参数,如下所示:
$ python -m src.scripts.script
因为您已经告诉 python 您正在运行哪个模块 (src
),所以它将在路径中。因此,script.py
会知道它是 src
的子模块,然后就可以从 src
导入。
但在这种情况下要小心 - 如果 src
中的某些内容导入 src.scripts.script
,则可能会创建循环导入。
作为这两种方法的替代方案,您可以直接在 script.py
中修改 sys.path
:
import sys
sys.path.insert(0, '/path/to/Project') # location of src
虽然这可行,但通常不是我的偏好。它需要 script.py
准确地知道你的代码是如何布局的,并且如果另一个 python 程序试图导入 script.py
可能会导致导入混淆。
关于Python 找不到我的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33862963/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!