使用Python导入复杂模块

时间:2013-11-07 11:01:08

标签: python import

你好pythonistas,

我有一个扩展的python脚本文件夹和子文件夹层次结构。 从任何脚本,我需要能够在任何其他文件夹中导入任何其他python脚本。 我创建了文件夹作为包,因为这是在许多网站上导入的推荐方式。

a portion of the whole file structure

我实施的第一个“游击队”方式,它的工作原理如下: 1.我创建了一个paths.py文件,我将每个新文件夹附加到sys.path。

import sys
import platform

if platform.system() == 'Linux':
    python_path = '/var/lib/jenkins/jobs/QA/workspace/Site'
else:
    python_path = 'C:/Python27/projects/QA/Site'

#ACADEMIES
sys.path.insert(1, python_path + '/Academies/Tests')
sys.path.insert(2, python_path + '/Academies/Suites')
sys.path.insert(3, python_path + '/Academies/inc')
sys.path.insert(35, python_path + '/Academies/Academy_wall')

2.在我执行导入的每个文件中,如下所示:

enter image description here

正如你所看到的,PyCharm抱怨进口;但是,当我运行它时,它可以工作。

是否可以使用paths.py文件导入其中的所有不同软件包,并且所有其他脚本只需调用import paths然后从那里导入我需要的不同文件像我现在一样? 从本质上讲,我想以更优雅和清晰的方式做同样的事情。

提前致谢!

1 个答案:

答案 0 :(得分:1)

因为这些文件夹中的所有模块似乎都相互依赖,所以我建议将这整个文件夹组成一个巨大的包,如下所示:

base
 |
 +--Academies
     |
     +- __init__.py
     +- FolderA
     |  +- __init__.py
     |  +- moduleA.py
     |  +- moduleB.py
     +- FolderB
     |  +- __init__.py
     |  +- moduleA.py
     |  +- moduleB.py

在每个模块中,请参考其他模块:

# File: Academies/FolderA/moduleA.py
from Academies.FolderB import moduleA, moduleB
from . import moduleB as local_b  # moduleB is a naming conflict in this example so we rename it to local_b for the scope of this file.

使用此方案,您仍然可以相对轻松地从任何其他模块引用模块。

如果您需要将模块作为__main__运行,则必须修改调用方式。

使用Academies上方的文件夹(在此示例中为基础)作为工作目录,您需要像这样调用folderB中的moduleA:

C:\path\to\base>python -m Academies.FolderB.moduleA