【问题标题】:Accessing code in adjacent files访问相邻文件中的代码
【发布时间】:2018-03-19 23:57:26
【问题描述】:

我在一个文件夹中有代码,并且想在相邻文件夹中导入代码,如下所示:

I am trying to import a python file in innerLayer2, into a file in innerLayer1
outerLayer:
           innerLayer1
                      main.py
           innerLayer2 
                      functions.py

我创建了以下函数来解决我的问题,但一定有更简单的方法吗?这也只适用于 Windows,我需要它同时在 linux 和 windows 上工作。

# main.py
import sys    
def goBackToFile(layerBackName, otherFile):
        for path in sys.path:
            titles = path.split('\\')
            for index, name in enumerate(titles):
                if name == layerBackName:
                    finalPath = '\\'.join(titles[:index+1])
                    return finalPath + '\\' + otherFile if otherFile != False else finalPath


    sys.path.append(goBackToFile('outerLayer','innerLayer2'))
    import functions

是否有更简单的方法适用于所有操作系统?

编辑:我知道最简单的方法是将 innerLayer2 放在 innerLayer1 内,但在这种情况下我不能这样做。文件必须相邻。

编辑:在分析收到的答案后,我发现了最简单的方法,并将其作为答案发布在下面。感谢您的帮助。

【问题讨论】:

标签: python directory python-import sys sys.path


【解决方案1】:

使用...PEP 328 等指定的包结构内寻址。

假设你有以下结构:

proj/
     script.py       # supposed to be installed in bin folder
     mypackage/      # supposed to be installed in sitelib folder
         __init__.py # defines default exports if any
         Inner1/
             __init__.py    # defines default exports from Inner1 if any
             main.py
         Inner2/
             __init__.py    # defines default exports from Inner2 if any
             functions.py

Inner1.main 应该包含这样的导入字符串:

from ..Inner2 import functions

【讨论】:

  • 如果我正在处理一个包,这将起作用,在我的场景中,这只会导致 ValueError:尝试相对导入超出顶级包
  • 我偶然发现了我的问题的完美答案,并将其作为答案发布。谢谢你
【解决方案2】:

如果您必须使用当前的目录设计,我建议您结合使用sysos 来简化您的代码:

import sys, os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
from innerLayer2 import functions

【讨论】:

  • 这很好用,谢谢你,但偶然发现了更简单的语法,它也能正常工作,我把它发布为你感兴趣的答案。
【解决方案3】:

在分析我收到的答案后,我发现了最简单的解决方案:只需使用此语法将外层目录添加到 sys.path,然后从内层 2 导入函数:

# main.py
import sys
sys.path.append('..') # adds outerLayer to the sys.path (one layer up)
from innerLayer2 import functions 

【讨论】:

    【解决方案4】:

    最简单的方法是:

    innerLayer2 文件夹移动到innerLayer1 文件夹内
    innerLayer2上添加一个名为__init__.py的空文件
    main.py 上使用以下内容:

     import innerLayer2.functions as innerLayer2
     # Eg of usage:
     # innerLayer2.sum(1, 2)
    

    【讨论】:

    • 在这种情况下,我不能把 innerLayer2 放在 innerLayer1 中,如果我可以把它放在另一个里面,那么我会使用 sys.append('innerLayer2) 然后只导入函数而不是你的方法。
    • @user3159253 提供了一个通用答案,不需要对您的结构进行任何更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2013-06-14
    • 2021-03-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多