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