2015-05-27 7 views
0

У меня была небольшая проблема с импортом сценарий, который был в родительской папке, но мне удалось решить его с помощью:Использование относительных импорта в Python с mutliple родителей и детей папки

import sys 
sys.path.append("../") 

Мой каталог, как это :

Data 
|->->code 
    |->->script1.py 
    |->->->->subfolder 
       |->->->script2.py 

Когда я запускаю script2 (который импортирует скрипт1) из каталога подпапки, скрипт работает без проблем. Но если я пытаюсь запустить Скрипт2 из каталога кода с помощью:

:~ ./subfolder/script2.py 

Я получаю сообщение об ошибке:

ImportError: No module named script1 

Я попытался с помощью относительного импорта, но потому, что мой код не структурирован в упаковках не Работа. Есть ли способ запустить скрипт2 из обоих каталогов (родительский и дочерний) и все еще иметь возможность импортировать скрипт1 каждый раз?

Спасибо заранее, Георги Николов

EDIT: Хорошо, после того, как я прочитал все предложения, я сделал «простой» хак, который довольно некрасиво, на мой взгляд, но работает очень хорошо:

import sys 
parent_folder = sys.path[0].split("/subfolder")[0] 
sys.path.append(parent_folder) 
import script1 

Теперь я могу даже назвать Скрипт2 от корня, и он будет управлять импортировать script1

+0

python версия? 2.7 и 3.x имеют разные значения по умолчанию импорта (что меня смущает). но, вообще говоря, если вы хотите повторно использовать код, лучше сделать его пакетом. это облегчает вашу жизнь, а другие хотят ссылаться на вашу работу. – HuStmpHrrr

+0

@HuStmpHrrr Я использую 2.7, и я не могу упаковать код, потому что это будет означать начало всего, что невозможно. Есть ли способ сделать это, не переключаясь на пакеты? –

+0

вам просто нужно обработать проблему 'pwd' или' cwd'. вы просто добавляете '../' путь к файлу. – HuStmpHrrr

ответ

1

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

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 

Объяснение

__file__   # The full path to your running file. 
os.path.dirname  # See below. (1) 
os.path.join  # See below. (2) 
sys.path.append  # See below. (3) 
".."    # Universal for "up a level". 
  1. os.path.dirname(path) -

    Return the directory name of pathname path.

  2. os.path.join(path, *paths) -

    Join one or more path components intelligently.

  3. sys.path -

    A list of strings that specifies the search path for modules.

Вы можете добавить строку Wi й метод append.

1

Вы должны использовать абсолютные пути:

import sys, os 
HERE = os.path.abspath(os.path.dirname(__file__)) 
sys.path.append(os.path.join(HERE, "..")) 

Но лучше не делать этого: Guido views running scripts within a package as an anti-pattern

Вы должны поставить автономные скрипты в корневой папке проекта. Сценарий не должен использоваться как модуль и как основной скрипт.

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