首页 > 解决方案 > 如何从不同目录导入同名的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 两次,而不是导入一次和 strings/Transformation.py 一次。为什么?当第二次导入发生时,stats 甚至不在 sys.path 中。

如果我将 stats/Transformation.py 和 strings/Transformation.py 的名称更改为不同的名称,它就可以工作。但我知道它可以与它们相同(并且由于各种原因,我希望它们相同),但它不会。为什么?

标签: python

解决方案


脚本中的这种路径杂耍方法很激烈,尽量不要这样做 - 调试将非常困难,并且忘记尝试将其转移到新安装、同事等。

而是尝试类似:

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 开始你会仅当它们会隐藏(具有相同)已安装的软件包时才需要它们。 (更多信息)


推荐阅读