Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问相邻文件中的代码_Python_Directory_Python Import_Sys_Sys.path - Fatal编程技术网

Python 访问相邻文件中的代码

Python 访问相邻文件中的代码,python,directory,python-import,sys,sys.path,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 我创建了以下函数来解决我的问题

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

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

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

最简单的方法是:

innerLayer2
文件夹移动到
innerLayer1
文件夹内
内层2

main.py上使用以下命令:

 import innerLayer2.functions as innerLayer2
 # Eg of usage:
 # innerLayer2.sum(1, 2)
最简单的方法是:

innerLayer2
文件夹移动到
innerLayer1
文件夹内
内层2

main.py上使用以下命令:

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

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

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

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

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

使用
在等人指定的包结构内寻址

假设您具有以下结构:

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

使用
在等人指定的包结构内寻址

假设您具有以下结构:

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

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

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

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

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

在这个场景中,我不能将innerLayer2放在innerLayer1中,如果我可以将它放在另一个里面,那么我将使用sys.append('innerLayer2)然后只导入函数而不是方法。@user3159253提供了一个通用答案,它不需要对结构进行任何更改。在这种情况下,我不能将innerLayer2放在innerLayer1中,如果我可以将它放在另一个内部,那么我将使用sys.append('innerLayer2')然后只导入函数而不是方法。@user3159253提供了一个不需要对结构进行任何更改的通用答案。我键入了答案,然后找到了一个可能的副本。我键入了答案,然后找到了一个可能的副本。如果我处理软件包,在我的场景中,这只会导致ValueError:尝试在顶级软件包之外进行相对导入我偶然发现了问题的完美答案,并将其作为答案发布。谢谢如果我在处理一个软件包,这会起作用,在我的场景中,这只会导致ValueError:尝试在顶级软件包之外进行相对导入我偶然发现了我的问题的完美答案,并将其作为答案发布。谢谢,这很好,谢谢,但是我偶然发现了更简单的语法,它同样有效,我把它作为你感兴趣的答案发布了。这很好,谢谢,但是我偶然发现了更简单的语法,它同样有效,我把它作为你感兴趣的答案发布了。