访问相邻文件中的代码

时间:2018-03-19 23:57:26

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

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

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中,但在这种情况下我不能这样做。文件必须相邻。

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

4 个答案:

答案 0 :(得分:2)

使用...来解决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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

最简单的方法是:

innerLayer2文件夹移至innerLayer1文件夹中 在__init__.py上添加名为innerLayer2的空文件 在main.py上使用以下内容:

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