linux 为什么我不能从另一个文件夹的函数导入?[重复]

9wbgstp7  于 12个月前  发布在  Linux
关注(0)|答案(1)|浏览(131)

此问题在此处已有答案

How to import a module from a folder next to the current folder?(3个答案)
11天前关闭
我无法从其他文件夹导入。
这是我的树。

(venv) ma1lor@ma1lor:~/test$ tree
.
├── asd
│   ├── __init__.py
│   └── message.py
└── sad
    ├── __init__.py
    └── main.py

2 directories, 4 files

字符串
main.py中:

from asd.message import message_func
from asd.message import email

print(message_func())
print(email)


message.py中:

def message_func():
    return 'hello , world'

email =43


这个问题不仅是在这个项目上,它的一切。不仅在linux,而且在windows(我有2个操作系统)
我试图从另一个文件夹导入功能,但没有工作。

798qvoo8

798qvoo81#

如果你的目的是让两个包成为一个包的一部分,那么把两个目录放在一个包目录中,在基目录中添加一个__init__.py,然后使用包内导入。例如:

.
├── my_great_package
       |
       ├── __init__.py
       ├── asd
       │   ├── __init__.py
       │   └── message.py
       └── sad
           ├── __init__.py
           └── main.py

from ..asd.message import message_func, email

字符串
如果您的意图是将adssad作为两个单独的包,那么您的导入是正确的。* 但是 *,这取决于您如何执行。

cd sad
python main.py


这是不正确的:不要从包本身执行文件。转到包的根目录(在您的示例中为.),然后执行

python sad/main.py


现在,Python将从当前目录.中查找导入的软件包。当在sad目录中时,Python不会向上搜索目录级别以搜索相邻的软件包,如asd
使用package - subpackage结构,您甚至可以更进一步:

python my_great_package/sad/main.py

  • 但你不应该在包目录 *(基本上是任何包含__init__.py文件的目录)中有可执行文件。如果你写了一个可执行文件(有些人称之为“脚本”),请在任何包目录的 * 外部 * 找到它。包文件应该包含可重用的函数,可执行文件应该导入包并调用这些函数。

你甚至可以把脚本放在根目录下的一个单独的目录下,比如scripts/,然后从那里运行它们。可能是script/something.py;如果你在scripts目录下运行它们,你可能需要你的PYTHONPATH(或者首先用pip install -e .安装软件包,但是如果你能避免使用PYTHONPATH,那就更好了:首先依赖于默认的Python包和导入查找,这使您的设置更具可移植性,然后才开始调整环境。

相关问题