在我开始之前,我想说-我知道,有很多类似的问题,但是我找不到我问题的答案。我有这样一个dir结构:
.
├── project
│ ├── A
│ │ ├── __init__.py
│ │ └── somelib.py
│ ├── B
│ ├── C
│ │ └── C
│ │ ├── foo.py
│ │ └── __init__.py
│ └── __init__.py
└── run.sh
运行.sh:
python3 project/C/C/foo.py
食品:
from project.A.somelib import somefunc
VS代码实际上获得了foo.py
中的智能感知——它告诉我可以从somelib
导入什么函数/变量。但是当我运行run.sh
时,我得到了一条错误消息:
有没有一种方法可以在保留目录结构的同时解决这个问题?在
project/__init__.py
没有任何改变foo.py
中的sys.path
如下所示:['/home/dabljues/projects/project/project/C/C', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
sys.path
,也不能修改PYTHONPATH
鉴于您的代码,我无法重现这一点(假设
run.sh
只是启动一个脚本)。在你确定这不是循环进口吗?在
像VSCode或Pycharm这样的ide对一个项目有自己的假设,并且通常会正确地链接模块,即使最终运行代码的解释器不能做到
找不到
project.A.somelib
的原因在sys.path
输出中是可见的,它提供了python搜索模块的位置。由于'/home/dabljues/projects/project/project'
未包含,因此python无法在运行时解析它。在快速破解
您只需手动将路径添加到
sys.path
,方法是在任何其他导入发生之前在foo.py
中运行import sys; sys.insert(0, '/home/dabljues/projects/project/project/')
,或者在run.sh
之前在shell中运行export PYTHONPATH="${PYTHONPATH}:/home/dabljues/projects/project/project/"
。在安装项目
既然看起来您正在开发一个库,那么您还可以使用python提供的机制使库可以共享,从而解决任何导入问题。向项目根添加一个最小的
setup.py
(即/home/dabljues/projects/project/project/setup.py
):并以可编辑模式安装项目:
^{pr2}$这将在您的
python3
可执行文件的site-packages
中放置一个指向项目根的链接,当您使用python3
运行任何内容时,都可以访问该根。在测试
我在所有python文件的顶部包含了
print(__name__)
,以获得一些输出。在跑步运行.sh不安装软件包:
安装后
如您所见,
project.C.C.foo
是作为一个脚本执行的,但是它会找到以project
开头的所有导入,因为安装了project
。在改变你的运行.sh作为模块运行
foo
的脚本。python3 -m proj.C.C.foo
相关问题 更多 >
编程相关推荐