Python导入中间文件夹

时间:2017-02-17 18:55:56

标签: python-3.x python-import

事前注意:这适用于我在Python 3.6.0中的文件,但是Python 3.x领域中的任何解决方案都是可以随意使用的!

导入文件夹之间

我目前在Windows上(并不重要)并且可以看到目录系统:

Python Projects (Irrelevant)
+- Some Project (Irrelevant)
+- Some other abandoned Project (Irrelevant)
|
| (Some space to put some thought on perspectives...)
|
+- Current Project
    +- game.py             <-(acting as a game-launcher)
    +- __init__.py         <-(for packaging purposes)
    +- main                <-(folder)
        +- menu.py
        +- __init__.py
        +- chapters        <-(folder)
            +- chap1a.py   <-(Irrelevant)
    +- misc                <-(folder)
        +- func.py
        +- __init__.py

我一直在试验几种导入方法,范围包括:
1. __import__方法本身
2.将所有文件放在一个文件夹中并在它们之间导入(可以正常工作,但我正在寻找更多&#39; Pythonic&#39;这样做的方法)
3.执行相对导入并重新调整sys.path以指导导入过程
4.使用from <whatever folder> import <file>
5.使用from <file> import <class or function>(有效,但我无法通过文件夹之间的问题) 6.将__all__ = ["filename", "filename"]放入__init__.py的中 7.使用folder.folder.file <attribute?>语法

导入

......以及更多让我失望的方法。 (也许我 幸运?)

更深入一点(我试过......)

我的原始导入方法,在我的所有工作最初都是在Python 2.7中编程并基于Raspberry Pi(啊,旧记忆)时使用,包括:
- 将__init__.py放置在我的所有子文件夹中,然后导入如下:import main.menu
- 在导入时另外使用细节:from misc.func import <function>
- 将所有文件放在一个文件夹中然后导入(当我转移到文件夹导入时,作为一种整理的方法)

上面的表现非常出色。但是......现在语法(和标准)有点不同,你可能会看到我的麻烦。

我尝试添加导入过程将采用的路径:

#Python
import sys
sys.path.append("/Current Folder/main/menu.py") #Example
import menu

,接收NameErrorModuleNotFoundError s:

Traceback (most recent call last):
 File "C:\Users\~\Documents\PythonProjects\CurrentProject\game.py", line 11, in <module>
  import menu
ModuleNotFoundError: No module named 'menu'

我现在不得不扩展个别功能导入,将它们转换为文件夹导入(远离外卡导入)。一个例子是game.py文件,(假设)使用:import main.menuimport misc.func

这很奇怪&#39;我的文件夹命名惯例也导致了以下问题:

这一切用于什么?

用户将通过执行game.py文件(或Windows / Mac可执行文件)开始游戏,该文件从“misc”中导入。文件夹:func.py,以及&#39; main&#39;:menu.py 游戏启动器将控制权移交给主菜单文件,主菜单显示(你得到它!)主菜单。如果用户退出,则会执行sys.exit(0)。但是,如果他们玩游戏,那么然后导入并播放chap.py文件(章节文件)。
完成特定章节文件后,可能会将控制权交还给menu.py然后会选择退出或播放更多章节文件。

令人难以置信,我知道。如果有人有更好的解决方案而不是我过去四个月所做的事情 - 请赐教,我需要更新我的&#34;知识库&#34; 拼命。
谢谢。

1 个答案:

答案 0 :(得分:0)

对于您向我们展示的具体尝试:

#Python
import sys
sys.path.append("/Current Folder/main/menu.py") #Example
import menu

正确的事情是做import main.menu并将该模块中的内容用作main.menu.whateverfrom main import menu并使用menu.whatever,而不是弄乱sys.path }。

至于为什么你尝试过没有工作,sys.path并没有这样做。它列出了文件夹,其内容Python搜索模块,而不是自己实现模块的文件或文件夹。如果您在路径上放置了.../main而不是.../main/menu.py,那么import menu就会成功。

但是,以这种方式搞乱sys.path会产生各种其他令人讨厌的后果,你真的不想处理这些后果,特别是如果你还没有使用常规进口的知识正确。您不希望最终得到同一模块的3个独立的,略有不同的副本,从同一个文件创建,或者所有其他可能导致您sys.path的错误。不要这样做。