我知道这是可能的,因为我以前做过。由于各种原因,我无法再访问之前的代码。
我的代码如下所示:
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/