有没有办法在python中从我的项目目录中的其他包导入一个外包

vxf3dgd4  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(121)

我在stackoverflow中读过link1link2,几乎理解了python包。我想知道有没有一种方法可以从我的项目目录中的其他包导入一个外包。
项目结构是这样的。

我想在main2.py中使用模块A的函数。没有必要写我得到的错误(因为它们在链接中提到)。**我想知道是否有一种直接的方法可以在funcs.py中导入模块A的main2.py?(而不改变项目的结构)**因为我在django中有相同的结构,当我在django项目中使用from app_name.module_name import func_name时,它工作了,但在这里不工作。我还读了link3,发现我在我的示例中单独运行了一个文件,而在django中我没有直接运行该模块,而是通过manage.py文件执行。
我也读了link4,但没有得到答案。我的整个项目是here

dgsult0t

dgsult0t1#

正确的做法是在当前Python环境中安装A包,作为常规包:这确保了可复制性,而不管“A”被放置在哪个确切的目录中。
除此之外,对于Python,如果包含“A”本身的文件夹在“sys.path”列表中,则“A”将“看起来像是安装了”。
所以:

import sys
sys.path.insert(0, "<pathto>/understanding_python_packages")
from A import funcs

会奏效的请注意,它将在进程中加载并执行A.__init__:“A”将被视为一个包。
如果你想让A.funcs作为一个独立的模块(只要它不依赖于“A”的其他东西),你可以将“A”目录本身添加到sys.path

import sys
sys.path.insert(0, ".../A")
import funcs

这不会加载A.__init__
请注意,从用户的Angular 来看,sys.path只是一个普通的Python列表,没有挂钩或其他特殊行为-它甚至可以被一个全新的列表示例所取代。上面调用的insert方法是普通的列表插入,位置0处的预挂起的新目录给予它们优先级。

kd3sttzy

kd3sttzy2#

您应该使用一个简单的toml文件打包您的代码
然后,使用pip install -e .在本地安装它
否则,您可以使用绝对导入。为了让这些在运行任意文件时都能正常工作,你需要你的Python路径包含你的包的根目录。当使用vscode时,你可以使用下面的启动配置来实现:

{
    "configurations": [
        {
            "name": "Python: File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "env": {
                "PYTHONPATH": "${workspaceFolder}/understanding_python_packages"
            },
            "justMyCode": true
        }
    ]
}

相关问题