事前注意:这适用于我在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
,接收NameError
或ModuleNotFoundError
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.menu
和import misc.func
。
这很奇怪&#39;我的文件夹命名惯例也导致了以下问题:
这一切用于什么?
用户将通过执行game.py
文件(或Windows / Mac可执行文件)开始游戏,该文件从“misc”中导入。文件夹:func.py
,以及&#39; main&#39;:menu.py
游戏启动器将控制权移交给主菜单文件,主菜单显示(你得到它!)主菜单。如果用户退出,则会执行sys.exit(0)
。但是,如果他们玩游戏,那么然后导入并播放chap.py
文件(章节文件)。
完成特定章节文件后,可能会将控制权交还给menu.py
,然后会选择退出或播放更多章节文件。
令人难以置信,我知道。如果有人有更好的解决方案而不是我过去四个月所做的事情 - 请赐教,我需要更新我的&#34;知识库&#34; 拼命。
谢谢。
答案 0 :(得分:0)
对于您向我们展示的具体尝试:
#Python
import sys
sys.path.append("/Current Folder/main/menu.py") #Example
import menu
正确的事情是做import main.menu
并将该模块中的内容用作main.menu.whatever
或from main import menu
并使用menu.whatever
,而不是弄乱sys.path
}。
至于为什么你尝试过没有工作,sys.path
并没有这样做。它列出了文件夹,其内容Python搜索模块,而不是自己实现模块的文件或文件夹。如果您在路径上放置了.../main
而不是.../main/menu.py
,那么import menu
就会成功。
但是,以这种方式搞乱sys.path
会产生各种其他令人讨厌的后果,你真的不想处理这些后果,特别是如果你还没有使用常规进口的知识正确。您不希望最终得到同一模块的3个独立的,略有不同的副本,从同一个文件创建,或者所有其他可能导致您sys.path
的错误。不要这样做。