【问题标题】:Python pathing when building/using modules构建/使用模块时的 Python 路径
【发布时间】:2020-06-04 22:16:24
【问题描述】:

(使用python 3.8版)

所以在我制作的一个模块中,我有这个功能:

#Auxillary function that returns True if plugin type is valid, else raise error
def checkTypeValid(pluginType):
    with open('PluginTypes.csv') as validTypes:
        reader = csv.reader(validTypes)
        for validType in reader:
            if validType[0] == pluginType:
                return(True)
        raise ValueError('Plugin Type %s does not exist' % pluginType)

当我运行它时,它运行良好。

但是,当我使用:from Plugins import PluginManager 从 Neuron.py 调用此函数时,它会给出错误“目录中没有此类文件”。我完全不知道该怎么做。从同级文件夹导入也有问题,但到目前为止我一直在解决这个问题。

文件结构:

【问题讨论】:

    标签: python python-import pythonpath


    【解决方案1】:

    这不起作用,因为插件位于与 NeuralNetwork 包无关的单独包中。

    如果您拥有的每个文件夹都有一个 __init __.py 文件,则它会创建一个包,这意味着您可以从 python 导入该包。

    例如

    Programs
    
    |----- Package1
                file1.py
                __ init __.py
    |------Package2
                file2.py
                __init __.py
    

    在这个设置中,有两个相互不认识的独立包。因此,您不能从 Package2 从 Package1 导入,反之亦然。但是,如果您将结构更改为这样,那就是通过添加 __ init __.py 将 Programs 变成一个包

    Programs
    
    |----- Package1
                file1.py
                __ init __.py
    |------Package2
                file2.py
                __init __.py
    __init __.py
    

    所以现在 Programs 也是一个包,并且 Package1 和 Package2 都在同一个包中,那么你可以从 file1.py 执行以下操作

    import Programs.Package2.file2
    

    这样做的缺点是,在导入时,每个文件都会包含对其周围包的引用。也就是说,这些包确实相互依赖,除非所有包都存在,否则它们无法工作。

    但是,如果包是真正独立的,另一种方法是通过执行以下操作将要使用的包添加到 sys.path 中

    import sys
    sys.path.append("/path/to/my/package")
    

    我已经尝试过了,我有以下文件结构

    mod1.py 代码如下

    from program.module2.mod2 import hello
    
    hello()
    

    mod2.py 有如下代码

    def hello():
        print("hello")
    

    main.py 代码如下

    from program.module1 import mod1
    

    从命令行,我转到程序上方的一个文件夹,然后输入以下内容

    PS C:\temp\example> ls
    
    
        Directory: C:\temp\example
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    d-----        21/02/2020    15:10                .vs
    d-----        21/02/2020    15:10                program
    
    
    PS C:\temp\example> python -m program.main
    hello
    

    【讨论】:

    • 我听从了你的建议,为每个文件夹添加了一个 init.py 文件,但我仍然遇到同样的错误,它说没有模块命名为我的名字试图导入。我在这里错过了什么吗?如果有帮助,我将使用 Spyder 4 作为我的 IDE 并运行 python 3.8。
    • 我不熟悉 Spyder 4,我猜它可能正在运行一个单独的文件,例如 Neuron.py,IDE 应该运行的是 Main.py。您还可以尝试在命令行上使用 python 进行实验,将它启动到 Main.py 所在的文件夹上方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多