为什么 Python 找不到我正在导入的文件?
Why can't Python find the files I'm importing?
最近我开始研究一个新的 Python 项目,我想我可以适当地构建它,而不是像往常一样将所有代码都放在一个目录中。使用 this tutorial 我为我的项目创建了一个这样的文件夹结构:
myappholder/
myappholder/README.md
myappholder/LICENSE.txt
myappholder/.gitignore
myappholder/myapp/
myappholder/myapp/__init__.py (empty file)
myappholder/myapp/main.py
myappholder/myapp/config.py
myappholder/myapp/subdir
myappholder/myapp/subdir/__init__.py (empty file)
myappholder/myapp/subdir/helper.py
main.py
的内容:
from myapp.subdir.helper import sayHello
subdir/helper.py
的内容:
from myapp.config import SOME_CONST
def sayHello():
print(SOME_CONST)
config.py
的内容:
SOME_CONST = 'Hello world'
当 运行 python main.py
(来自 myappholder/myapp
)时,我收到此错误(为简洁起见删除了跟踪):ModuleNotFoundError: No module named 'myapp
。当 运行 python -m main
(来自 myappholder/myapp
) 我得到同样的错误。
我知道这可能是我做错的一件非常简单的事情,但是几个小时的谷歌搜索并没有解决问题。我不确定问题是出在我如何设置项目还是我如何 运行 但我们将不胜感激。
详情:
- 我 运行 Python 3.8 Windows
- 我正在尝试创建一个 GUI 应用程序,而不是一个库
你应该在你的 根文件夹 (myappholder) 到 运行 一切。
你的目录结构是这样的:(当你在myappholder里面时)
以更好的方式编写目录结构,如下所示:
.
├── myapp
│ ├── config.py
│ ├── __init__.py
│ ├── main.py
│ └── subdir
│ ├── helper.py
│ └── __init__.py
└── README.md
长而完整的解决方案
了解 python 导入的工作原理。你好像不是很了解。
阅读这篇详细而精彩的文章:https://realpython.com/python-import/
您需要学习的概念:
- Absolute and Relative Imports
- Python’s Import Path
- Official docs python 导入的内部工作方式
用于测试您的应用程序的快速解决方案
打开终端并运行 python
(从项目的根目录)
现在在此交互式 shell 中,导入 myapp
并调用您需要的函数 运行。
公开一个 cli
如果您需要公开 CLI,您可以打包您的应用程序,使用 poetry
or setuptools 非常好。
您可以定义一个命令行界面。
例如,如果您使用的是诗歌,您可以将其放入 pyproject.toml
[tool.poetry.scripts]
samplepy = 'samplepy:cli'
现在,运行ning,来自终端的samplepy
将执行samplepy
包的cli
函数。
所以你 运行 来自 myappholder/myapp
? myappfolder
中的 运行 或删除第一层层次结构(from myapp.X.X
中的 myapp
)。
在 myappholder
中创建另一个 main_app.py
文件,在该文件中从 myapp/main.py
调用 运行 项目中的 function/module。
然后 运行 main_app.py
脚本,它将起作用
最近我开始研究一个新的 Python 项目,我想我可以适当地构建它,而不是像往常一样将所有代码都放在一个目录中。使用 this tutorial 我为我的项目创建了一个这样的文件夹结构:
myappholder/
myappholder/README.md
myappholder/LICENSE.txt
myappholder/.gitignore
myappholder/myapp/
myappholder/myapp/__init__.py (empty file)
myappholder/myapp/main.py
myappholder/myapp/config.py
myappholder/myapp/subdir
myappholder/myapp/subdir/__init__.py (empty file)
myappholder/myapp/subdir/helper.py
main.py
的内容:
from myapp.subdir.helper import sayHello
subdir/helper.py
的内容:
from myapp.config import SOME_CONST
def sayHello():
print(SOME_CONST)
config.py
的内容:
SOME_CONST = 'Hello world'
当 运行 python main.py
(来自 myappholder/myapp
)时,我收到此错误(为简洁起见删除了跟踪):ModuleNotFoundError: No module named 'myapp
。当 运行 python -m main
(来自 myappholder/myapp
) 我得到同样的错误。
我知道这可能是我做错的一件非常简单的事情,但是几个小时的谷歌搜索并没有解决问题。我不确定问题是出在我如何设置项目还是我如何 运行 但我们将不胜感激。
详情:
- 我 运行 Python 3.8 Windows
- 我正在尝试创建一个 GUI 应用程序,而不是一个库
你应该在你的 根文件夹 (myappholder) 到 运行 一切。
你的目录结构是这样的:(当你在myappholder里面时)
以更好的方式编写目录结构,如下所示:
.
├── myapp
│ ├── config.py
│ ├── __init__.py
│ ├── main.py
│ └── subdir
│ ├── helper.py
│ └── __init__.py
└── README.md
长而完整的解决方案
了解 python 导入的工作原理。你好像不是很了解。
阅读这篇详细而精彩的文章:https://realpython.com/python-import/
您需要学习的概念:
- Absolute and Relative Imports
- Python’s Import Path
- Official docs python 导入的内部工作方式
用于测试您的应用程序的快速解决方案
打开终端并运行 python
(从项目的根目录)
现在在此交互式 shell 中,导入 myapp
并调用您需要的函数 运行。
公开一个 cli
如果您需要公开 CLI,您可以打包您的应用程序,使用 poetry
or setuptools 非常好。
您可以定义一个命令行界面。
例如,如果您使用的是诗歌,您可以将其放入 pyproject.toml
[tool.poetry.scripts]
samplepy = 'samplepy:cli'
现在,运行ning,来自终端的samplepy
将执行samplepy
包的cli
函数。
所以你 运行 来自 myappholder/myapp
? myappfolder
中的 运行 或删除第一层层次结构(from myapp.X.X
中的 myapp
)。
在 myappholder
中创建另一个 main_app.py
文件,在该文件中从 myapp/main.py
调用 运行 项目中的 function/module。
然后 运行 main_app.py
脚本,它将起作用