创建Python包的问题

bvjveswy  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(101)

我正在创建一个Python包,其结构如下:

VisionPy/
│   __init__.py
│   main.py
│   plugin_interface.py
│   README.md
│
├── controllers/
│   ├── __init__.py
│   ├── imagecontroller.py
│   ├── volumecontroller.py
│
├── models/
│   ├── __init__.py
│   ├── imagemodel.py
│   ├── volumemodel.py
│
├── plugins/
│   ├── CScan/
│   │   ├── __init__.py
│   │   ├── NDEToolkit.py
│   │   ├── plugin.py
│   │   ├── requirements.txt
│   ├── __init__.py
│
├── ui/
│   ├── views/
│   │   ├── __init__.py
│   │   ├── imageview.py
│   │   ├── label.py
│   │   ├── mainview.py
│   │   ├── volumeview.py
│   ├── __init__.py
│
├── utils/
    ├── __init__.py
    ├── progress_window.py

字符串
我的问题是,这意味着以后编译和执行的方式,它允许我创建插件的Cscan是。
到目前为止,我执行应用程序的方法是从VisionPy目录中运行python main.py。目前的问题是我无法从 plugin.py 导入NDEToolkit,尽管它们在同一个文件夹中。这是一个问题,因为我想创建一个插件界面,即使对不太了解编程的人也可以轻松访问,将文件夹附加到系统路径似乎不是实现它的最佳方法。
此外,我希望能够编译项目与PyInstaller或一些类似的包,使它很容易只是粘贴到插件,其中至少包含一个文件夹 * plugin.py * 和一个 * requirements.txt * 文件,这是我的界面工程。
我不知道我是否真的需要所有这些 * init**.py* 文件,因为我不打算把整个东西打包,因为它是一个用PyQt 5开发的GUI应用程序,main.py 看起来像这样:

# main.py

import sys
from PyQt5.QtWidgets import QApplication
from controllers.imagecontroller import ImageController
from controllers.volumecontroller import VolumeController
from ui.views.mainview import MainView

def main():
    app = QApplication(sys.argv)

    # Create the main view
    main_view = MainView()

    # Create the controllers and pass the main_view to them
    image_controller = ImageController(main_view)
    volume_controller = VolumeController(main_view)

    # Set controllers in the main view
    main_view.set_image_controller(image_controller)
    main_view.set_volume_controller(volume_controller)

    # Show the main view
    main_view.show()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()


正如musicamante指出的,这是给我带来问题的代码,它是 *VisionPy/plugins/CScan/plugin.py *:

from plugin_interface import PluginInterface
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

from pathlib import Path
import traceback
import sys
import os
print(sys.path)

plugin_dir = str(Path(__file__).parent.resolve())
if plugin_dir not in sys.path:
    sys.path.append(plugin_dir)

import NDEToolkit as ndt
import numpy as np
import tifffile
import matplotlib.pyplot as plt

class Plugin(PluginInterface):
.
.
.


问题出现在import NDEToolkit as ndt行中,正如您所看到的,NDEToolkit.pyplugin.py 位于同一个文件夹中,这是我试图导入它的文件。
我组织这个项目时考虑了MVC模式。

koaltpgm

koaltpgm1#

您正在尝试从子包导入。您需要执行绝对导入(首选方法)或相对导入。

绝对导入:

import plugins.CScan.NDEToolkit as ndt

字符串

相对导入:

import .NDEToolkit as ndt


这在PEP 8(上面链接),其他questionsanswers以及free online sources中有很好的记录。

相关问题