Python 从本地脚本导入本地包
我的项目结构如下:Python 从本地脚本导入本地包,python,Python,我的项目结构如下: . ├── README.md ├── my_project │ ├── __init__.py │ ├── config.py │ ├── integrations │ │ ├── __init__.py │ │ └── google_places.py ├── requirements.txt └── scripts └── my_script.py 在my_script.py中,我有: from my_project.integra
.
├── README.md
├── my_project
│ ├── __init__.py
│ ├── config.py
│ ├── integrations
│ │ ├── __init__.py
│ │ └── google_places.py
├── requirements.txt
└── scripts
└── my_script.py
在my_script.py
中,我有:
from my_project.integrations.google_places import GooglePlaces
但是,在运行python脚本/my_script.py
时,我遇到以下错误:
ModuleNotFoundError: No module named 'my_project'
在本地,我可以pip install-e.
mypackage(通过向mix中添加setup.py
),但是,由于我需要从GitHub操作运行它,因此我觉得采用相同的方法没有意义
我一直在读有关操纵sys.path的文章,但这似乎有点老土
既然这是一个相当常见的设置(我猜),那么建议用什么方法来修复上述错误呢?如果有意义的话,我可以改变项目结构。这也让我感到惊讶,但是在阅读了这个相当全面的答案,并进入了有关python中的应用程序的链接python文档之后,我认为您必须调整
PYTHONPATH
。问题是这两个python文件位于两个独立的包中,即scripts
和my_project
,因此my_script.py
无法找到google_places.py
,因为PYTHONPATH
只包含当前包,而不包含父文件夹,python将只搜索以下目录(请参阅前面提到的搜索路径文档):
- 包含输入脚本的目录(或未指定文件时的当前目录)
- PYTHONPATH(目录名列表,语法与shell变量PATH相同)
- 与安装相关的默认设置
PYTHONPATH
并不是一个真正的黑客解决方案(尽管我也会这么认为),而是根据python编写的文档解决方案
如果可能的话,如果我处在你的位置,我想我会将my_script.py
移动到my_project
包中,如下所示
.
├── README.md
├── my_project
│ ├── __init__.py
│ ├── config.py
│ ├── integrations
│ │ ├── __init__.py
│ │ └── google_places.py
│ └── my_script.py
└── requirements.txt
然后,您可以将导入调整为:
from integrations.google_places import GooglePlaces
编辑: 如果您喜欢使用以下文件树结构(甚至原始文件也可以) 您可以这样修改sys.path,然后使用原始的import语句:
import sys
import os
sys.path.insert(0, os.getcwd())
from my_project.integrations.google_places import GooglePlaces
谢谢你的回复。我提到
脚本
不是一个包,因为它不包含任何\uuu init\uuuuuuuuuy.py
文件。但是,我已经将脚本
移动到我的项目
下,制作了一个包,按照您的建议更新了导入,并使用python我的项目/scripts/my_script.py运行脚本
,但是失败了:modulenofounderror:没有名为“integrations”的模块
是的,这是有意义的,因为python将再次根据其搜索模型进行搜索:“包含输入脚本的目录(或未指定文件时的当前目录)”。这意味着它可以在myu项目/scripts/
和PYTHONPATH
中查看。如果需要将其保存在scripts
下,则应更新sys.path
@linkyndy我刚刚添加了另一个示例代码,该示例代码适应sys.path
,以便成功导入模块。它还应该允许使用原始文件树结构。让我知道它是否有效:)我最终在顶层移动了所有脚本,不再在脚本下嵌套。谢谢你的帮助!我也会这么做的。感觉不那么烦人了:D
import sys
import os
sys.path.insert(0, os.getcwd())
from my_project.integrations.google_places import GooglePlaces