Руководящие ресурсы в проекте Python

SELECT Call.ID, Call.date, Call.phone_number 
FROM Call 
LEFT OUTER JOIN Phone_Book 
  ON (Call.phone_number=Phone_book.phone_number) 
  WHERE Phone_book.phone_number IS NULL

Должен удалить подзапрос, позволив оптимизатору запросов работать его волшебство.

кроме того, избегайте "ВЫБОРА *", потому что он может повредить Ваш код, если кто-то изменяет базовые таблицы или представления (и это неэффективно).

44
задан JJ Geewax 13 September 2009 в 18:31
поделиться

3 ответа

Вы можете использовать библиотеку pkg_resources , которая поставляется с setuptools .

Например, я быстро создал небольшой пакет "proj" , чтобы проиллюстрировать схему организации ресурсов, которую я бы использовал:

proj/setup.py
proj/proj/__init__.py
proj/proj/code.py
proj/proj/resources/__init__.py
proj/proj/resources/images/__init__.py
proj/proj/resources/images/pic1.png
proj/proj/resources/images/pic2.png

Обратите внимание, как я храню все ресурсы в отдельном подпакете.

"code.py" показывает, как pkg_resources используется для ссылки на объекты ресурсов:

from pkg_resources import resource_string, resource_listdir

# Itemize data files under proj/resources/images:
print resource_listdir('proj.resources.images', '')
# Get the data file bytes:
print resource_string('proj.resources.images', 'pic2.png').encode('base64')

Если вы запустите его, вы получите:

['__init__.py', '__init__.pyc', 'pic1.png', 'pic2.png']
iVBORw0KGgoAAAANSUhE ...

Если вам нужно рассматривать ресурс как файловый объект, используйте resource_stream () .

] Код доступа к ресурсам может находиться где угодно в структуре подпакета вашего проекта, ему просто нужно указать полное имя подпакета, содержащего изображения: proj.resources.images , в данном случае.

Вот установка ".py ":

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(name='proj',
      packages=find_packages(),
      package_data={'': ['*.png']})

Предупреждение: Чтобы проверить что-то «локально», то есть без предварительной установки пакета, вам нужно будет вызвать свои тестовые сценарии из каталога, в котором есть setup.py . Если вы находитесь в том же каталоге, что и code.py , Python не узнает о пакете proj . Поэтому такие вещи, как proj.resources , не разрешаются.

52
ответ дан 26 November 2019 в 22:15
поделиться

Вы всегда можете иметь отдельную папку "ресурсы" в каждом подпакете, который в ней нуждается, и использовать функции os.path для доступа к ним из __ файла __ значения ваших подпакетов. Чтобы проиллюстрировать, что я имею в виду, я создал следующий файл __ init __. Py в трех местах:

c:\temp\topp        (top-level package)
c:\temp\topp\sub1   (subpackage 1)
c:\temp\topp\sub2   (subpackage 2)

Вот файл __ init __. Py :

import os.path
resource_path = os.path.join(os.path.split(__file__)[0], "resources")
print resource_path

В c: \ temp \ work , Я создаю приложение topapp.py следующим образом:

import topp
import topp.sub1
import topp.sub2

Это представляет приложение, использующее пакет и подпакеты topp . Затем я запускаю его:

C:\temp\work>topapp
Traceback (most recent call last):
  File "C:\temp\work\topapp.py", line 1, in 
    import topp
ImportError: No module named topp

Это как и ожидалось. Мы устанавливаем PYTHONPATH для имитации наличия нашего пакета на пути:

C:\temp\work>set PYTHONPATH=c:\temp

C:\temp\work>topapp
c:\temp\topp\resources
c:\temp\topp\sub1\resources
c:\temp\topp\sub2\resources

Как вы можете видеть, пути к ресурсам правильно разрешены до местоположения фактических (под) пакетов на пути.

Обновление: Здесь '

5
ответ дан 26 November 2019 в 22:15
поделиться

@ pycon2009, там была презентация по distutils и setuptools. Вы можете найти все видео здесь

Яйца и развертывание сборки в Python - Часть 1

Яйца и развертывание сборки в Python - Часть 2

Яйца и развертывание сборки в Python - Часть 3

В этих видео , они описывают, как включить статические ресурсы в ваш пакет. Я верю, что это часть 2.

С помощью setuptools вы можете определять зависимости, это позволит вам иметь 2 пакета, которые используют ресурсы из третьего пакета.

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

1
ответ дан 26 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

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