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

标签 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 的名称更改为不同的名称,则它可以工作。但我知道它可以在它们相同的情况下工作(并且由于各种原因,我希望它们相同),但事实并非如此。为什么?

最佳答案

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

尝试类似的方法:

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)

关于python - 如何从不同目录导入同名的 python 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685938/

相关文章:

python - 如何通过 XPath 查找具有两个可能类名的元素?

python - Python 中的乘法表仅显示六列

python - python中如何将一个字符串复制到另一个字符串

python - 本地数据库上的 Firebird 连接在 Python 脚本中是不可能的

python - SQLAlchemy Date Time 对象可以在 Flask 中显示本地时区吗

python - 如何使用 Google 在 Appengine 上的默认身份验证来跟踪 session ( session 持续时间、用户从何处登录等)?

python - 带有pyserial(python串口)的二进制数据

python - 获取 numpy 以警告整数溢出

python - `pandas.merge` 无法识别相同的索引

python - Kivy Widget id 在 __init__ 中访问