2017-02-17 5 views
-1

Предварительно Примечание: Это применяется к моим файлам в Python 3.6.0, однако любое решение в Python 3.x отлично работает!Python Импорт промежуточных папок

Импорт в промежутках между папками

Я в настоящее время на 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. размещая все файлы в одну папку и импорта между ними (что работает, но я ищу более методу «вещей» делать это)
3. выполняя относительный импорт и перенастройки sys.path для руководства процесса импорта
4. с помощью from <whatever folder> import <file>
5. используя from <file> import <class or function> (который работает, но Я не могу пройти мимо «между папки» проблемы)
6. размещая __all__ = ["filename", "filename"] в __init__.py «s
7. импортирования с folder.folder.file <attribute?> синтаксиса

... и многие другие методы, которые имеют в конечном счете, не удалось мне. (Может быть, я не совсем , что повезло?)

Немного более глубокий (то, что я пытался ...)

Мой оригинальный метод импортирования, используемый, когда вся моя работа была изначально запрограммирована Python 2.7 и на основе Raspberry Pi (ах, старые воспоминания), состоял из:
- Размещение __init__.py «S во всех моих подпапках затем импортировать как: 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' 

Я сейчас приходится расширять по индивидуальному FUNCTION- импортирует, превращая их в импорт папок (находясь далеко от импорта дикой карты). Примером может служить файл game.py, который (предположительно) использует: import main.menu и import misc.func.

Это «странно» Папка-именование шахты также приводит к вопросу:

Что все это используется для?

Пользователь будет начать игру, выполнив game.py файл (или Windows/Mac Executable), который импортирует из папки «разностороннего»: func.py, и от «основной»: menu.py.
Game-launcher передает управление в файл главного меню, в котором отображается (вы получили его!) В главном меню. Если пользователь уйдет, он выполнит sys.exit(0). Однако, если они играют в игру, это будет , затем import-and-play файл chap.py (файл главы).
Как только этот конкретный файл главы будет закончен, он, предположительно, отрегулирует управление на menu.py, который будет , затем предоставит возможность выхода из игры или воспроизведения других файлов разделов.

Разум ошеломляющий, я знаю. Если у кого-то есть лучшее решение, чем то, что я делал в течение последних четырех месяцев, пожалуйста, просветите меня, мне нужно обновление от «Knowledge-bank» отчаянно.
Спасибо.

+1

Большинство вещей, которые вы пробовали, должно было хорошо работать, хотя не все из них были бы хорошей идеей. Вы, должно быть, делаете что-то не так, как вы не показали нам. Покажите нам конкретный код ошибки и сообщите нам, как это происходит, включая полное сообщение об ошибке и трассировку стека, если таковая имеется. – user2357112

+1

Кроме того, ничто об этой настройке не является особым или уникальным отличием от гигантской кучи других вопросов импорта Python. – user2357112

+0

@ user2357112 Теперь мой «неудачный код» недоступен - так как у меня была «абсолютно отличная идея» по его удалению, чтобы затем заменить его тем, что я узнал или взял отсюда. Но я могу отредактировать свой пост, чтобы подробно показать, что я сделал. – ghostwalker13

ответ

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. Не делай этого.

+0

К вашей первой части ... если бы я должен был обернуть весь свой файл главного меню в функцию, тогда позвоните ему из игровой пусковой установки: это сработает, правильно? Как вы говорите, я могу сделать 'main.menu. '. Если это так, круто. – ghostwalker13

+0

Я экспериментировал в течение нескольких дней (да, мне это так долго), и я, кажется, взломал его - оказывается, что все это делает в функции и делает вызов. Благодаря! – ghostwalker13

Смежные вопросы