В Python, как я могу эффективно управлять ссылками между файлами сценария?

Это происходит, вероятно, из-за обновления версии ruby. Попробуйте установить драгоценные камни снова с помощью bundle install, а затем повторите попытку. Если вы не работаете, вам нужно будет запустить bundle exec rails db:migrate для связки, выбрать правильную версию драгоценных камней.

РЕДАКТИРОВАТЬ: , так как вы используете rvm, убедитесь, что вы используете те же версии Ruby. Взгляните на этот https://rvm.io/workflow/projects и убедитесь, что вы в правильной версии. Подсказка: проверьте версию Ruby в Gemfile, так как это может быть источником вашей проблемы.

6
задан Ray Vega 13 November 2008 в 18:49
поделиться

6 ответов

Простой ответ должен поместить Ваш повторно используемый код в Ваш каталог пакетов сайта, который находится в Вашем sys.path.

Можно также расширить путь поиска путем добавления .pth файлов где-нибудь в пути. См. https://docs.python.org/2/install/#modifying-python-s-search-path для получения дополнительной информации

О, и Python 2.6/3.0 добавляет поддержку PEP370, Каталога пакетов сайта В расчете на пользователя

4
ответ дан 10 December 2019 в 00:46
поделиться

Если Ваши допускающие повторное использование файлы упаковываются (то есть, они включают __init__.py файл), и путь к тому пакету является частью Вашего PYTHONPATH или sys.path затем, необходимо смочь сделать просто

import Foo

Этот вопрос предоставляет еще несколько подробной информации.

(Примечание: Как Jim сказал, Вы могли также отбросить свой повторно используемый код в Ваш site-packages каталог.)

3
ответ дан 10 December 2019 в 00:46
поделиться

Можно вставить допускающий повторное использование материал site-packages. Это абсолютно прозрачно, так как это находится в sys.path по умолчанию.

Можно поместить someName.pth файлы в site-packages. Эти файлы имеют каталог, в котором живет Ваш фактический допускающий повторное использование материал. Это также абсолютно прозрачно. И не включает дополнительный шаг установки изменения в site-packages.

Можно поставить каталог допускающего повторное использование материала PYTHONPATH. Это немного менее прозрачно, потому что необходимо удостовериться, что это установлено. Не аэрокосмические исследования, но не абсолютно прозрачный.

1
ответ дан 10 December 2019 в 00:46
поделиться

Самый простой путь состоит в том, чтобы установить (или добавить к), PYTHONPATH, и поместите (или символьная ссылка) свои модули и пакеты в путь, содержавшийся в PYTHONPATH.

1
ответ дан 10 December 2019 в 00:46
поделиться

В одном проекте я хотел удостовериться, что пользователь мог поместить сценарии Python (который мог в основном использоваться в качестве плагинов), где угодно. Мое решение состояло в том, чтобы поместить следующее в файл конфигурации для того проекта:

[server]
PYPATH_APPEND: /home/jason:/usr/share/some_directory

Тем путем это добавило бы/home/jason и/usr/share/some_directory к пути Python в запуске программы.

Затем это - просто простой вопрос разделения строки двоеточиями и добавлением тех каталогов в конец sys.path. Можно хотеть рассмотреть помещение модуля в каталоге пакетов сайта, который содержит функцию, чтобы читать в том файле конфигурации и добавить те каталоги к sys.path (к сожалению, у меня нет времени в данный момент для записи примера).

Как другие упомянули, это - хорошая идея поместить как можно больше в пакеты сайта и также использующий .pth файлы. Но это может быть хорошей идеей, если у Вас есть сценарий, который должен импортировать набор материала, это не находится в пакетах сайта, которые Вы не хотели бы импортировать из других сценариев.

(может также быть способ сделать это использование .pth файлы, но мне нравится способность управлять путем Python в том же месте, как я поместил остальную часть моей информации о конфигурации),

1
ответ дан 10 December 2019 в 00:46
поделиться

Мое решение состояло в том, чтобы упаковать одну утилиту, которая импортирует модуль: my_util находится в пакетах сайта

import my_util

foo = myutil.import_script('..//shared1//reusable_foo')
if foo == None:
    sys.exit(1)


def import_script(script_path, log_status = True):
    """
    imports a module and returns the handle
    """
    lpath = os.path.split(script_path)

    if lpath[1] == '':
        log('Error in script "%s" in import_script' % (script_path))
        return None


    #check if path is already in sys.path so we don't repeat
    npath = None
    if lpath[0] == '':
        npath = '.'
    else:
        if lpath[0] not in sys.path:
            npath = lpath[0]

    if npath != None:
        try:
            sys.path.append(npath)
        except:
            if log_status == True:
                log('Error adding path "%s" in import_script' % npath)
            return None

    try:   
        mod =  __import__(lpath[1])
    except:
        error_trace,error_reason =  FormatExceptionInfo()
        if log_status == True:
            log('Error importing "%s" module in import_script: %s' % (script_path, error_trace + error_reason))
        sys.path.remove(npath)
        return None

    return mod
0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: