如何从不同目录导入相同名称的python模块?

时间:2018-10-07 06:14:02

标签: python

我知道这是可能的,因为我以前做过。由于各种原因,我再也无法访问以前做过的代码。

我的代码如下:

transformationsDirectory = os.path.join('..', 'transformations')
for transformationName in requestedTransformationNames.keys():
    if os.path.isdir(os.path.join(transformationsDirectory, transformationName)):
        sys.stdout.write('\t' + transformationName + '...\n')
        sys.stdout.flush()

        sys.path.append(os.path.join(transformationsDirectory, transformationName))
        mainTransformationPythonModule = importlib.import_module('Transformation')
        print(str(sys.path))
        print(dir(mainTransformationPythonModule))
        sys.path.remove(os.path.join(transformationsDirectory, transformationName))

要导入的“ transformations”目录中有两个文件夹,一个称为“ stats”,另一个称为“ strings”。两者都包含一个名为“ Transformation.py”的文件,其中包含一个Transformation类。

运行代码的输出:

['/Users/<working directory>', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Users/Eddie/Library/Python/3.5/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages', '../transformations/stats']
['AbstractTransformation', 'Output', 'Transformation', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'copy', 'os']
['/Users/<working directory>', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Users/Eddie/Library/Python/3.5/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages', '../transformations/strings']
 ['AbstractTransformation', 'Output', 'Transformation', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'copy', 'os']

因此sys.path的输出正确,但是加载模块的输出不正确。它们不应该是相同的(字符串包含的内容比列出的要多得多),但是它们是相同的。从此以及程序其余部分的行为来看,很明显python两次导入stats / Transformation.py,而不是一次导入stats / Transformation.py。为什么?第二次导入时,统计信息甚至不在sys.path中。

如果我将stats / Transformation.py和字符串/Transformation.py的名称更改为不同,则可以使用。但我知道它可以与它们相同(并且出于各种原因,我希望它们相同),但事实并非如此。为什么?

1 个答案:

答案 0 :(得分:3)

这种脚本中的路径变通方法非常复杂,请尝试不做-调试起来非常困难,而忘记尝试将其转移到新的安装,同事等中。

相反,请尝试以下操作:

from common_dir.stats.transformations import Transformations as StatsTransformations
from common_dir.strings.transformations import Transformations as StringsTransformations

from x import y部分将帮助您导航到目录。

import y as z部分将帮助您消除具有相同名称的类的歧义。

注意:在某些情况下,具体取决于您的python版本,您可能需要将__init__.py个文件放入属于其的文件夹中(它们可以为空白),这是一个好习惯,您应该这样做无论如何,但是从3.3开始,仅当它们会遮盖(具有与已安装的程序包相同)时,才需要它们。 (more info)