2011-12-29 4 views
48

У меня есть каталог, полный скриптов (скажем project/bin). У меня также есть библиотека, расположенная в project/lib и хочу, чтобы скрипты автоматически загружали ее. Это то, что я обычно использую в верхней части каждого скрипта:Python: Лучший способ добавить к sys.path относительно текущего скрипта запуска

#!/usr/bin/python 
from os.path import dirname, realpath, sep, pardir 
import sys 
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib") 

# ... now the real code 
import mylib 

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

На самом деле то, что я надеюсь на что-то так гладко, как это:

#!/usr/bin/python 
import sys.path 
from os.path import pardir, sep 
sys.path.append_relative(pardir + sep + "lib") 

import mylib 

Или еще лучше, то, что бы не сломаться, когда мой редактор (или кто-то другой, кто имеет доступ для фиксации) решает изменить порядок импорт как часть процесса очистки до:

#!/usr/bin/python --relpath_append ../lib 
import mylib 

это не порт непосредственно к не Posix платформы, но это будет держать вещи в чистоте.

+0

Смотрите также: http://stackoverflow.com/questions/2349991/python-how-to-import-other-python-files/20749411#20749411 – dreftymac

ответ

13

Если вы не хотите редактировать каждый файл

  • Установите вам библиотеку как обычный питона libray
    или
  • Установите PYTHONPATH в ваш lib

или если вы хотите добавить одну строку в каждый файл, добавьте оператор импорта вверху, например.

держать import_my_lib.py в бункере и import_my_lib может правильно установить путь питона к любому lib вы хотите

72

Это то, что я использую:

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

Создайте модуль обертки project/bin/lib, который содержит следующее:

import sys, os 

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')) 

import mylib 

del sys.path[0], sys, os 

Затем вы можете заменить все кряк в верхней части ваших сценариев с:

#!/usr/bin/python 
from lib import mylib 
4

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

PYTHONPATH=.:$PYTHONPATH alembic revision --autogenerate -m "First revision" 

И называют это день!

+0

https: //docs.python.org/3/tutorial/modules.html#the-module-search-path говорит: «sys.path инициализирован из этих местоположений: - каталог, содержащий входной скрипт». Я думаю, что это неправда. – jms

9

Я использую:

import sys,os 
sys.path.append(os.getcwd()) 

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

  • Нет связанных вопросов^_^