0

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

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

4 回答 4

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
于 2018-03-20T00:23:43.530 回答
1

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

import sys, os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
from innerLayer2 import functions
于 2018-03-20T00:20:16.323 回答
1

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

# main.py
import sys
sys.path.append('..') # adds outerLayer to the sys.path (one layer up)
from innerLayer2 import functions 
于 2018-03-20T00:40:54.633 回答
0

最简单的方法是:

将文件夹移动到文件夹innerLayer2里面 添加一个名为的空文件就 可以使用如下:innerLayer1
__init__.pyinnerLayer2
main.py

 import innerLayer2.functions as innerLayer2
 # Eg of usage:
 # innerLayer2.sum(1, 2)
于 2018-03-20T00:09:52.577 回答