2013-11-07 2 views
4

Привет, дружище питонисты,Комплексный модуль импорта с помощью Python

У меня есть расширенный иерархии папок и вложенных папок питона сценариев. Из любого сценария мне нужно иметь возможность импортировать любой другой скрипт python внутри любой из этих других папок. Я создал папки как пакеты, потому что это был рекомендуемый способ для импорта на многие сайты.

a portion of the whole file structure

Первый «партизанский» путь, который я осуществил, и это работает следующий образом: 1. Я создал paths.py файл, в котором я добавляемый к sys.path каждой новой папки.

import sys 
import platform 

if platform.system() == 'Linux': 
    python_path = '/var/lib/jenkins/jobs/QA/workspace/Site' 
else: 
    python_path = 'C:/Python27/projects/QA/Site' 

#ACADEMIES 
sys.path.insert(1, python_path + '/Academies/Tests') 
sys.path.insert(2, python_path + '/Academies/Suites') 
sys.path.insert(3, python_path + '/Academies/inc') 
sys.path.insert(35, python_path + '/Academies/Academy_wall') 

2.Inside каждый файл я импортирующей так:

enter image description here

Как вы можете видеть PyCharm жалуется на импорт; однако, когда я запускаю его, он работает.

Возможно ли иметь файл paths.py, который импортирует все различные пакеты там и для всех других сценариев, чтобы просто позвонить import paths, а затем импортировать только те файлы, которые мне нужны, как сейчас? По сути, я хочу сделать то же самое, что и я, более элегантным и понятным способом.

Заранее благодарен!

+1

Это должно быть возможно, если вы идете 'os.chdir (somePath) 'вы сможете импортировать вещи из' somePath'. Вы можете хранить пути, где живут разные сценарии, и просто «chdir», чтобы вам было нужно. Так или иначе, я это делаю. Это не очень элегантно, но работает. Также 'os.walk' может быть полезен, если вы хотите импортировать все сразу. –

ответ

1

Ну так как все модули в этих папках, по всей видимости зависят друг от друга, то я бы предложил сделать весь этот набор папок гигантского пакета, например, так:

base 
| 
+--Academies 
    | 
    +- __init__.py 
    +- FolderA 
    | +- __init__.py 
    | +- moduleA.py 
    | +- moduleB.py 
    +- FolderB 
    | +- __init__.py 
    | +- moduleA.py 
    | +- moduleB.py 

В каждом из этих модулей, см. другие модули:

# File: Academies/FolderA/moduleA.py 
from Academies.FolderB import moduleA, moduleB 
from . import moduleB as local_b # moduleB is a naming conflict in this example so we rename it to local_b for the scope of this file. 

С помощью этой схемы вы по-прежнему можете относиться к модулям с любого другого модуля с относительной легкостью.

Если вам нужно запустить модуль как __main__, вам придется изменить способ его вызова.

С выше Академий (база в данном примере) в качестве рабочей директории папку, вы хотите позвонить ModuleA в folderB так:

C:\path\to\base>python -m Academies.FolderB.moduleA 
+0

Я никогда не использовал PyCharm, но я предполагаю, что есть способ установить базовый рабочий каталог. Если это так, то это должно прекратить бросать ошибки с этой настройкой. –

+0

Большое спасибо Якобу, я попробую, как вы предлагаете, и посмотрите, как это происходит. –

+0

@wehappyfew любые обновления о том, как это получилось? Проблемы и т. Д.? –

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