Python 导入依赖项

Python import dependencies

我正在动态创建一些 python 代码,我想 运行 在包装器中。这是一个过于简化的例子。

[wrapper.py]

import cv2
img = cv2.imread('pic.png',0)

__import__("fragment")

cv2.imshow('pic',img)

[fragment.py]

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

我希望包装器设置任何导入和变量,然后导入将执行操作的片段(即使图像灰度化),然后再执行一些标准化操作(即显示图像)。

碎片会发生变化(遗传算法),所以我更愿意将它们与设置分开,设置将保持不变,只会让操作碎片变得更加复杂。

当我 运行 程序时,我得到片段的依赖错误,因为 cv2 和 img 没有定义(范围错误)。有没有办法通过更正我上面使用的方法或其他方法来实现这一点?

我希望我也可以在 ram 中创建文件的组合,然后执行它或使用包含所有需要的包装的自身版本覆盖片段,但我想看看是否有首先是更清洁的东西。

此致,保罗。

The fragments will be changing (genetic algorithm) so I would prefer to keep them separate from the setup which will be constant and will just get make manipulating the fragments more complicated.

无论您在 fragment.py 中实现的遗传算法的复杂性如何,我都看不到导入 cv2(以及最终更多模块)将如何以某种方式影响它。

不过,我同意你第一部分的说法,你要尊重separation of concerns的原则,让你的代码更简洁。

我看到的针对您的问题的解决方案是设置一个配置文件 config.py,您可以在其中设置所有导入。但是将 config.py 导入其他文件是没有用的,除非您成功地使 cv2 等模块在其他地方一劳永逸。您可以通过 config.py 文件中的 dynamically importing them 来实现:

cv2=__import__('cv2')

在您的主程序、fragment.py 文件或任何模块中,您可以通过简单地 运行 宁此:

来使用 cv2
import config
config.cv2.imread('pic.png')

import config ↔ 你不再需要 运行: import cv2。这是因为此技巧将 cv2 呈现为跨多个模块可用的全局变量。

同样的想法也适用于您需要在 config.py 文件中声明的其他变量,例如 img

鉴于这些事实,这是我针对您的问题的解决方案。请注意,我没有使用 类 和函数:我更愿意直接解决您的问题,而不是让事情过于简单明了。

代码组织:

config.py文件对应你的wrapper.py:

solution/
├── application.py
├── cfg
│   ├── config.py
│   └── __init__.pyc
├── gallery
│   └── pic.png
└── genalgos
    ├── fragment.py
    └── __init__.py

config.py:

# This will make cv2 global and thus you won't need to import it in ./genalgos/fragment.py
# You can use the same idea for all your other imports
cv2=__import__('cv2')
imgc=cv2.imread('./gallery/pic.png') # imgc is global

fragment.py:

# The only import you can not avoid is this one
import cfg.config

# imgs is global
# By importing cfg.config you do not need to import cv2 here
imgf=cfg.config.cv2.cvtColor(cfg.config.imgc,cfg.config.cv2.COLOR_BGR2GRAY) 

application.py:

import cfg.config
import genalgos.fragment
if __name__=="__main__":

   """
    Display the image 'imgc' as it is in 'cfg/config' file
   """
   cfg.config.cv2.imshow('Pic in BGR',cfg.config.imgc)
   cfg.config.cv2.waitKey(0)
   cfg.config.cv2.destroyAllWindows()

   """
    Display the grascaled image 'imgf' as it is in 'genalgos/fragment' file which
    itself is obtained after transforming imgc of 'cfg/config' file.
   """
   cfg.config.cv2.imshow('PIC Grayscaled',genalgos.fragment.imgf)
   cfg.config.cv2.waitKey(0) # Press any key to exit
   cfg.config.cv2.destroyAllWindows() # Unpaint windows and leave