Programación

Python: Virtualenvs y Virtualenvwrapper

Nekmo

Mayo 31, 2016

pip virtualenvwrapper python virtualenv workon

Hablar de los Virtualenvs es hablar de una de las herramientas más útiles y necesarias en un usuario de Python.

Muchos, cuando leen el término "virtual", suelen asociarlo a pérdidas de rendimiento o mayor consumo de recursos, como el que podríamos encontrar en una máquina Java. Es por ello, que tal vez muchos se asusten de Virtualenv cuando leen el término "virtual", cuando en realidad no hay razón para ello.

Cuando se usa Virtualenv, no existe una virtualización de ningún tipo. En resumidas cuentas, lo único que hacemos es decirle a Python "carga los módulos de /home/nekmo/.virtualenvs/nekmo.com/lib/python3.5/site-packages/ en vez de /usr/lib/python3.5/site-packages/". Nada más. Esto lo que nos permite es tener en nuestro Virtualenv paquetes distintos a los que tenemos en el sistema. ¿Y para qué nos sirve esto?

La utilidad de Virtualenv

En los virtualenvs podremos instalar paquetes independientes a los de nuestro sistema. Esto tiene diversas utilidades:

  • Realizar pruebas con nuevos paquetes sin necesidad de comprometer los paquetes del sistema.
  • Crear un entorno con paquetes aislados de los del sistema para un proyecto o programa.
  • Aislar las dependencias de nuestros proyectos de las del sistema, para poder importarlas y exportarlas en otros entornos.

La primera se explica sola. ¿Y la segunda? Ésta es sobre todo útil para administradores y usuarios de programas Python: si uso un programa en Python crítico o que tengo miedo que pueda romperse al actualizar el sistema, puedo crear un Virtualenv con los paquetes que requiere dicho programa (encontrándose estos aislados de los del sistema). También sirve a la inversa: si el sistema tiene dependencias con paquetes de versiones de Python antiguas y el programa requiere de paquetes más actuales, puede crearse un virtualenv con las nuevas versiones.

La tercera es similar a la segunda, pero orientada a programadores. Un problema común de cualquier proyecto, son las dependencias y sus versiones. En ocasiones, puede olvidarse apuntar una dependencia en un proyecto, o puede que éste sólo funcione a partir de cierta versión de una dependencia, y uno no se dé cuenta. Con los virtualenvs este problema se solventa: si se instalan las dependencias en el Virtualenv, y se genera el listado de dependencias (con sus versiones), es posible utilizar ese mismo listado en otro sistema para replicar el mismo virtualenv, y conseguir que todo funcione exactamente igual.

Pero ahora pasemos de la teoría, y pongámonos a la práctica.

Virtualenvwrapper

Trabajar con virtualenvs con las herramientas de serie es tedioso. Es por ello, que recomiendo utilizar algo como Virtualenvwrapper, que reduce todos los comandos que normalmente tendrían que utilizarse para crear y trabajar con virtualenvs, a uno solo.

Lo primero es instalar Virtualenvwrapper, bien con el gestor de paquetes del sistema, bien con Pip.

Debian/Ubuntu: sudo apt-get install virtualenvwrapper
Arch Linux: sudo pacman -S python-virtualenvwrapper
Fedora: sudo dnf install python-virtualenvwrapper
En cualquier otro: sudo pip install virtualenvwrapper

 

Ahora debemos poner en nuestro .bashrc lo siguiente:

~/.bashrc
---------
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Projects
source `which virtualenvwrapper.sh`

Aquí tenemos 2 paths importantes: uno es WORKON_HOME, que es donde se alojarán los virtualenvs con los módulos de Python que usemos. Nosotros, normalmente no tocaremos aquí, por lo que tiene sentido que sea un directorio oculto. El otro, PROJECT_HOME, es donde se encontrarán los proyectos que hagamos (en caso de que vayamos a crear proyectos). Entraré en detalles sobre esto más adelante.

El directorio ~/.virtualenvs lo creará el propio virtualenvwrapper, pero el directorio ~/Projects (el del PROJECT_HOME) no.

~$ mkdir ~/Projects

 

Ahora debemos recargar nuestro shell (también podemos salir y volver a entrar).

~$ source ~/.bashrc

 

Tras esto ya tendremos todo listo. Ahora crearemos un primer virtualenv:

[nekmo@homura ~]$ mkvirtualenv test
Using base prefix '/usr'
New python executable in test/bin/python3
Also creating executable in test/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/nekmo/.virtualenvs/test/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/nekmo/.virtualenvs/test/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/nekmo/.virtualenvs/test/bin/preactivate
virtualenvwrapper.user_scripts creating /home/nekmo/.virtualenvs/test/bin/postactivate
virtualenvwrapper.user_scripts creating /home/nekmo/.virtualenvs/test/bin/get_env_details
(test)[nekmo@homura ~]$

Nada más entrar en un virtualenv, puede verse que antes del prompt, se encuentra el nombre del virtualenv entre paréntesis. Esto significa que nuestra instalación de Python está aislada de la del sistema, y no contaremos con los paquetes que tuviésemos. No sólo esto: cualquier programa Python que ejecutemos mientras estamos en modo virtualenv, se ejecutará en el virtualenv.

 

Uno de los paquetes que se instala de serie en los virtualenvs, es pip. Lo usaremos para instalar requests:

(test)[nekmo@homura ~]$ pip install requests
...
Successfully installed requests-2.10.0

 

Si se entra en un intérprete de Python, podrá verse que el módulo de requests que importamos, está en el virtualenv.

(test)[nekmo@homura ~]$ python
...
>>> import requests
>>> requests.__file__
'/home/nekmo/.virtualenvs/test/lib/python3.5/site-packages/requests/__init__.py'

 

Ahora salimos del virtualenv:

(test)[nekmo@homura ~]$ deactivate

Si quisiésemos, podríamos volver a entrar:

[nekmo@homura ~]$ workon test

 

Los proyectos son una característica específica de Virtualenvwrapper que nos facilita un poco el trabajo en nuestros proyectos Python. Funcionan igual que los virtualenvs que hemos creado con mkvirtualenv con la diferencia de que al usar su comando, mkproject <proyecto>, se creará un directorio ~/Projects/<proyecto> y accederemos a él automáticamente cuando usemos workon. Como vemos no es una gran diferencia, pero nos evitará tener que ir hasta el directorio cada vez.

[nekmo@homura ~]$ mkproject miproyecto
...
Creating /home/nekmo/Projects/miproyecto
Setting project for miproyecto to /home/nekmo/Projects/miproyecto
(miproyecto)[nekmo@coco-laptop ~/Projects/miproyecto]$ 

 

Chuletario Virtualenvwrapper

Fuera del virtualenv

Comando Descripción
mkvirtualenv <venv> Crear un virtualenv
mkproject <proj> Crea un directorio de proyecto con su correspondiente virtualenv
mktmpenv Crea un virtualenv sin nombre y temporal, que al hacer deactivate se autodestruye.
rmvirtualenv <venv> Borrar un virtualenv. En el caso de proyectos, no borra el dir. de proyecto.
allvirtualenv <command> Ejecutar un comando en todos los venv. Útil para actualizar pip.

 

Dentro del virtualenv

Comando Descripción
workon <venv> Entrar en un virtualenv
deactivate Salir del virtualenv actual
cdvirtualenv Ir al directorio ~/.virtualenvs/<venv>
cdsitepackages Ir al directorio ~/.virtualenvs/<venv>/lib/PythonX.Y/site-packages
cdproject En el caso de proyectos, volver al directorio del proyecto.
wipeenv Borrar todos los paquetes del venv.
add2virtualenv <dir 1>[ <dir 2>] Permite añadir directorios al site-packages del virtualenv sin instalarlos
toggleglobalsitepackages Permite o deshabilita que se pueda acceder a paquetes del sistema en el virtualenv.

 

Crear y restaurar el requirements.txt

Esto no es algo propio de Virtualenv ni de Virtualenvwrapper, pero creo conveniente mencionarlo al utilizarse en conjunto cuando se trabaja en proyectos.

Es posible que hayas visto alguna vez un archivo llamado requirements.txt en algún proyecto Python, y te hayas preguntado qué es. Pues bien, se trata de un listado con los paquetes necesarios para que el proyecto funcione. Por ejemplo:

requirements.txt
----------------
Django==1.9.5
django-mptt==0.8.3
dpaste==2.10
ecdsa==0.13
...

 

Pues bien, si estamos usando en nuestro proyecto virtualenv, y todos los paquetes del virtualenv son para que funcione nuestro proyecto, ¿por qué no usar el listado de paquetes instalados en el virtualenv? Esto es lo que hace pip freeze, pudiendo generar un archivo requirements.txt

(miproyecto)[nekmo@homura ~/Projects/miproyecto]$ pip freeze > requirements.txt

 

Luego es posible reinstalar todos los paquetes del requirements.txt en otro virtualenv con:

(proj2)[nekmo@homura ~/Projects/proj2]$ pip install -r requirements.txt

En teoría, si reinstalamos los mismos paquetes con las mismas versiones en el nuevo sistema, todo debería funcionar exactamente igual que en el entorno original, lo cual lo convierte en una excelente solución para deployments (poner nuestro trabajo en el entorno real de trabajo).

 

¿Cómo funcionan los virtualenvs?

Cuando iniciamos un virtualenv, lo primero que se hace, es ejecutar el script ./bin/activate del virtualenv, que en el caso de virtualenvwrapper con la configuración usada, sería:

~/.virtualenvs/<venv>/bin/activate

 

Si abrimos este script, veremos que es un sencillo script de bash que entre otras cosas, hace lo siguiente:

PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

Con esto lo que se está haciendo es poner en primer lugar el directorio ./bin de virtualenv para la carga de binarios, por lo que priorizará el ejecutable de Python que allí se encuentra sobre el el del sistema. Podemos ver el ejecutable de Python del virtualenv en dicho directorio:

(test)[nekmo@homura ~/.virtualenvs/test/bin]$ ls -1
activate
...
easy_install
pip
python
...

 

La siguiente parte del truco se encuentra en cómo Python determina cual es su directorio con las bibliotecas: cuando se ejecuta el intérprete, éste va a buscar, desde la ruta en que se encuentra el binario, el archivo ./lib/pythonX.Y/os.py (sí, busca os.py literalmente), y desde el directorio del binario, va bajando niveles hasta encontrarlo. Así pues, en el caso de un virtualenv, esto suele ser:

~/.virtualenvs/<venv>/bin/lib/python2.7/os.py << No existe, sigo bajando...
~/.virtualenvs/<venv>/lib/python2.7/os.py << ¡Existe! ¡Usaré este directorio!

Para más información, recomiendo ver este vídeo y el PEP correspondiente.

 

Ejecutar programas en un virtualenv sin usar workon

Aunque con la anterior explicación se ha descubierto el pastel, por si acaso doy la respuesta: si workon sólo ejecuta ./bin/activate, y éste lo que hace es priorizar el binario de Python del virtualenv sobre el del sistema, para ejecutar un programa Python con virtualenv, sólo hay que usar su binario para ejecutar el programa. Así pues, usando:

[nekmo@homura ~]$ ~/.virtualenvs/test/bin/python miprograma.py

Es como si estuviésemos ejecutando miprograma.py dentro del virtualenv.

 

¿Qué puede salir mal?

Los virtualenvs son una de las cosas más geniales de Python para trabajar, pero sí que comentaría 2 cosas a tener en cuenta para evitar disgustos, como me ha pasado a mí:

La primera, que el ejecutable de Python del virtualenv require del intérprete de Python del sistema. Esto significa, que si actualizamos el del sistema, afectaremos también al del virtualenv. Esto normalmente no tendría que ser un problema, pues Python es muy estable en versiones patch (las 2.7.X), pero podría darse. Un problema habitual, sobre todo si se trabaja con Python3, es que se rompan los enlaces al actual, por ejemplo, de Python3.5 a 3.6. En tales casos, puede instalarse la versión específica que Python que usábamos a parte de la nueva. Si tuviésemos un entorno crítico, siempre podemos compilar Python a mano y enlazar a su ejecutable cuando se crea el virtualenv.

Otro posible problema, es cuando trabajamos con bibliotecas que no son puramente Python: es el caso por ejemplo de lxml o de MySQL-Python. En tales casos, al instalar la biblioteca con pip usando un requirements.txt, podríamos tener efectos indeseados si no se poseen los componentes necesarios para su compilación en el sistema, o podría no funcionar por las versiones de los mismos. Hay que tenerlo presente si se usan dependencias de este tipo.

Otras dudas comunes

¿Me ofrecen los virtualenvs una protección extra, como la de un sandbox?

No. Usar virtualenvs no es más seguro que usar las bibliotecas del sistema. Ésta no es su finalidad. Si buscas una solución para sandbox, recomiendo echarle un ojo a este artículo, aunque personalmente recomiendo conjuntarlo con una solución como Docker.

¿No se solapan los virtualenvs con Docker?

En cierta medida, sí. No hay nada con Virtualenvs que no puedas hacer con Docker. Pero utilizar Virtualenvs suele ser mucho más rápido y cómodo, además de no traer consigo un pico de recursos en la inicialización. Tox, otra excelente herramienta, utiliza virtualenvs para ejecutar baterías de tests con diversas versiones de Python y dependencias. Como suele ser necesario probar múltiples combinaciones (Python 3.5 con Django 1.9-1.7, Python 3.4 con Django 1.9-1.6...), puede llegar a usar hasta 30 combinaciones o más. Esto con virtualenvs es algo trivial y muy rápido, cosa que con Docker no.

¿Más dudas?

¡Gracias por leer mi artículo! Me ha llevado casi 1 semana en escribirlo con el poco tiempo que puedo dedicarle al blog. Espero que haya servido para animar a más gente a utilizar estas magníficas herramientas, y a programar en Python. Si tienes cualquier duda, no dudes en escribirla en los comentarios.

Comments

ZacharyPhave 1 semana, 5 días
<a href=http://achatviagraenpharmacieenfrance.com/>acheter viagra en ligne belgique </a> 
<a href=" http://achatviagraenpharmacieenfrance.com/ ">achat viagra generique belgique</a>
AlvinCic 1 semana, 5 días
<a href=http://achetersildenafilenligne.com/>acheter sildenafil 50 mg </a> 
<a href=" http://achetersildenafilenligne.com/ ">acheter sildenafil 100mg</a>
JuniorVes 1 semana, 5 días
<a href=http://acheterviagraenlignelivraison24h.com/>acheter viagra livraison express </a> 
<a href=" http://acheterviagraenlignelivraison24h.com/ ">vente viagra livraison rapide </a>
Edwardvobia 1 semana, 5 días
<a href=http://sildenafil100mgprixenpharmacieenfrance.com/>viagra gГ©nГ©rique 100 mg prix </a> 
<a href=" http://sildenafil100mgprixenpharmacieenfrance.com/ ">prix viagra 100mg pharmacie france </a>
Davidtak 1 semana, 5 días
<a href=http://sildenafilpascherenfrance.com/>viagra pas cher sans ordonnance </a> 
<a href=" http://sildenafilpascherenfrance.com/ ">viagra pas cher en ligne </a>
MichaelBon 1 semana, 5 días
<a href=http://sildenafilpfizer50mgprix.com/>sildenafil pfizer 50 mg ГЎr </a> 
<a href=" http://sildenafilpfizer50mgprix.com/ ">sildenafil pfizer 50 mg ГЎra - sildenafil pfizer 50 mg ГЎra: </a>
LeonardAmoma 1 semana, 5 días
<a href=http://viagraenventelibreenfrance.com/>viagra en vente libre quebec </a> 
<a href=" http://viagraenventelibreenfrance.com/ ">viagra en vente libre en france </a>
RichardLem 1 semana, 5 días
<a href=http://viagrapascherlivraisonrapide.com/>viagra pas cher pharmacie paris </a> 
<a href=" http://viagrapascherlivraisonrapide.com/ ">viagra pas cher canada </a>
RobertcrawL 1 semana, 5 días
<a href=http://viagrasansordonnanceenpharmacie.com/>viagra sans ordonnance belgique </a> 
<a href=" http://viagrasansordonnanceenpharmacie.com/ ">viagra sans ordonnances en pharmacie </a>
Claudeciz 1 semana, 5 días
<a href=http://xn--viagragnriquelivresous48h-hicb.com/>viagra gГ©nГ©rique </a> 
<a href=" http://xn--viagragnriquelivresous48h-hicb.com/ ">viagra gГ©nГ©rique pas cher </a>
Meese44 1 semana, 5 días
signs of heat exhaustion symptoms of oral stds 
http://viagra-withoutdoctorprescriptions.net/#fnnps.html 
viagra without a doctor prescription cpr first aid certification 
<a href="http://viagra-withoutdoctorprescriptions.net/">viagra without a doctor prescription not scam</a> 
aua medical school 
http://www.viagra-withoutdoctorprescriptions.net/ viagra without a doctor prescription 
medical health insurance
Michaelanege 1 semana, 4 días
<a href=http://cialis10mgprixenpharmacieenligne.com/>prix du cialis 10mg cpr4 </a> 
<a href=" http://cialis10mgprixenpharmacieenligne.com/ ">cialis 10mg cpr4 prix en pharmacie </a>
Harryquity 1 semana, 4 días
<a href=http://cialis20mgprixenpharmacierx.com/>cialis 20mg le prix </a> 
<a href=" http://cialis20mgprixenpharmacierx.com/ ">cialis 20mg prix en pharmacie en france </a>
WilliamVot 1 semana, 4 días
<a href=http://xn--cialisgnriquepascher-h2bb.com/>cialis generique le moins cher </a> 
<a href=" http://xn--cialisgnriquepascher-h2bb.com/ ">acheter cialis generique moins cher </a>
Garrettmip 1 semana, 4 días
<a href=http://cialissansordonnanceenfrance.com/>cialis sans ordonnance paris </a> 
<a href=" http://cialissansordonnanceenfrance.com/ ">cialis sans ordonnance pharmacie paris </a>
JamesIdece 1 semana, 4 días
<a href=http://achetercialisenfrancesitefiable.com/>acheter cialis en france forum </a> 
<a href=" http://achetercialisenfrancesitefiable.com/ ">acheter cialis en france site fiable </a>
Bobbyfoera 1 semana, 4 días
<a href=http://achetercialis20mgenligne.com/>acheter cialis 20mg original </a> 
<a href=" http://achetercialis20mgenligne.com/ ">achat cialis 20mg en france </a>
Ralphwal 1 semana, 4 días
<a href=http://achetercialissansordonnanceenpharmacie.com/>acheter du cialis en france sans ordonnance </a> 
<a href=" http://achetercialissansordonnanceenpharmacie.com/ ">vente de cialis sans ordonnance en france </a>
OdellSlask 1 semana, 4 días
<a href=http://achatcialisenfrancelivraisonrapide.com>achat cialis en france </a> 
<a href=" http://achatcialisenfrancelivraisonrapide.com ">achat cialis en france sans ordonnance </a>
RichardGet 1 semana, 4 días
<a href=http://xn--achatcialissitescuris-q5bf.com/>achat cialis site sГ©curisГ© </a> 
<a href=" http://xn--achatcialissitescuris-q5bf.com/ ">achat cialis site securise </a>
KeithHox 1 semana, 4 días
<a href=http://achatcialis5mgenligne.com/>acheter cialis 5mg en france </a> 
<a href=" http://achatcialis5mgenligne.com/ ">vente cialis 5mg </a>
HectorFlire 1 semana, 3 días
<a href=http://tadalafil20mgpaschereninde.com/>acheter cialis 20mg pas cher </a> 
<a href=" http://tadalafil20mgpaschereninde.com/ ">cialis 20mg pas cher paris </a>
Thomasniz 1 semana, 3 días
<a href=http://tadalafilprixenpharmacie.com/>cialis prix en pharmacie quГ©bec </a> 
<a href=" http://tadalafilprixenpharmacie.com/ ">cialis prix en pharmacie belgique </a>
Andrewvok 1 semana, 3 días
<a href=http://achetertadalafil20mgpascher.com/>achat cialis 20mg en ligne </a> 
<a href=" http://achetertadalafil20mgpascher.com/ ">achat cialis 20mg en france </a>
JamesDiarm 1 semana, 3 días
<a href=http://achetertadalafilsansordonnance.com/>acheter cialis sans danger </a> 
<a href=" http://achetertadalafilsansordonnance.com/ ">acheter cialis sans ordonnance </a>
JamesSon 1 semana, 3 días
<a href=http://achetertadalafilenfrance.com/>achat cialis en france </a> 
<a href=" http://achetertadalafilenfrance.com/ ">acheter cialis en france sans ordonnance </a>
Leonardnew 1 semana, 3 días
<a href=http://achattadalafilenfranceenpharmacie.com/>achat cialis en ligne france </a> 
<a href=" http://achattadalafilenfranceenpharmacie.com/ ">achat cialis generique en france </a>
DonaldTar 1 semana, 3 días
<a href=http://achattadalafil10mgprix.com/>acheter cialis 10 mg </a> 
<a href=" http://achattadalafil10mgprix.com/ ">acheter cialis 10mg france </a>
Leonardbligo 1 semana, 3 días
<a href=http://acheterprednisone20mgenligne.com/>acheter prednisone 20 mg en ligne </a> 
<a href=" http://acheterprednisone20mgenligne.com/ ">acheter prednisone en ligne </a>
BryanGax 1 semana, 3 días
<a href=http://xn--acheterpropeciagnrique-q8bb.com/>acheter propecia generique en ligne </a> 
<a href=" http://xn--acheterpropeciagnrique-q8bb.com/ ">acheter propecia gГ©nГ©rique </a>
GustavoLeaby 1 semana, 3 días
<a href=http://acheterpropeciasurinternet.com/>acheter propecia sur internet </a> 
<a href=" http://acheterpropeciasurinternet.com/ ">ou acheter du propecia sur internet </a>
JosephSab 1 semana, 2 días
<a href=http://achatpropeciaparcartebancaire.com/>achat propecia par carte bancaire </a> 
<a href=" http://achatpropeciaparcartebancaire.com/ ">achat propecia parts online </a>
Anthonyglopy 1 semana, 2 días
<a href=http://acheterfinasteridesansordonnance.com/>acheter propecia en ligne avis </a> 
<a href=" http://acheterfinasteridesansordonnance.com/ ">achat finasteride en ligne </a>
MarvinBug 1 semana, 2 días
<a href=http://achatamoxicillinebiogaran1g.com/>achat amoxicilline biogaran 1g </a> 
<a href=" http://achatamoxicillinebiogaran1g.com/ ">amoxicilline achat en ligne </a>
Jamestom 1 semana, 2 días
<a href=http://amoxicillineprixpharmacie.com/>amoxicilline acide clavulanique prix maroc </a> 
<a href=" http://amoxicillineprixpharmacie.com/ ">amoxicilline 1g prix maroc </a>
AaronPrers 1 semana, 2 días
<a href=http://acheterclomidsansordonnance.com/>ou acheter du clomid sans ordonnance </a> 
<a href=" http://acheterclomidsansordonnance.com/ ">acheter clomid en pharmacie sans ordonnance </a>
TimothyCot 1 semana, 2 días
<a href=http://acheterclomid100mgsurinternetpascher.com/>acheter clomid 100mg sur internet pas cher </a> 
<a href=" http://acheterclomid100mgsurinternetpascher.com/ ">acheter clomid 100mg </a>
AdrianFem 1 semana, 2 días
<a href=http://ventolinesansordonnanceacheterenligne.com/>ventoline sans prescription </a> 
<a href=" http://ventolinesansordonnanceacheterenligne.com/ ">ventoline sans ordonnance </a>
Jamesvap 1 semana, 2 días
<a href=http://acheterventolinespraysansordonnance.com/>acheter ventoline sans ordonnance belgique </a> 
<a href=" http://acheterventolinespraysansordonnance.com/ ">acheter ventoline spray </a>
SamuelPoult 1 semana, 2 días
<a href=http://acheterventolinesurinternet.com/>comment acheter ventoline sans ordonnance </a> 
<a href=" http://acheterventolinesurinternet.com/ ">acheter ventolin sur internet </a>
Vincentthila 1 semana, 2 días
<a href=http://achatventolinesansordonnance.com/>comment acheter ventoline sans ordonnance </a> 
<a href=" http://achatventolinesansordonnance.com/ ">achat ventoline sans ordonnance </a>
yovyomd 1 semana, 1 día
individual medical insurance plans venereal disease photos 
http://generic-viagra.us.com/ 
generic viagra overnight delivery online medical education 
<a href="http://generic-viagra.us.com/">cialis vs viagra</a> 
heat stroke exhaustion treatment 
http://www.generic-viagra.us.com/ - generic viagra 
health insurance options for individuals
oixlvv 1 semana, 1 día
heat exhaustion recovery time gonorrhea symptoms 
http://canadianpharmacies.org/ 
canadian pharmacy health care reform bill 
<a href="http://canadianpharmacies.org/">canadian pharmacy</a> 
std in the mouth 
http://canadianpharmacies.org/ walmart pharmacy price check 
school of medical
Bryanblusa 1 semana, 1 día
<a href=http://howtogetviagrawithoutadoctorprescription.us/>how to get viagra without going to a doctor </a> 
<a href=" http://howtogetviagrawithoutadoctorprescription.us/ ">how to get viagra without - how to get viagra without: </a>
Perryneuts 1 semana, 1 día
<a href=http://wherecanibuyviagraonline.us/>where can i buy viagra online </a> 
<a href=" http://wherecanibuyviagraonline.us/ ">where can i buy viagra over the counter in new york </a>
Jamesberly 1 semana, 1 día
<a href=http://acheterzithromaxsurinternetenfrance.club/>acheter zithromax sur internet en france </a> 
<a href=" http://acheterzithromaxsurinternetenfrance.club/ ">acheter zithromax en ligne </a>
AnthonyCadia 1 semana, 1 día
<a href=http://acheterazithromycinesansordonnance.club/>acheter azithromycine sans ordonnance </a> 
<a href=" http://acheterazithromycinesansordonnance.club/ ">acheter azithromycin canada </a>
Dustinseeva 1 semana, 1 día
<a href=http://vardenafilprixenpharmacieacaen.com/>levitra 20mg prix en pharmacie </a> 
<a href=" http://vardenafilprixenpharmacieacaen.com/ ">levitra prix en pharmacie </a>
Scottmor 1 semana, 1 día
<a href=http://howtogetviagrawithoutadoctorprescription.com/>how to buy viagra cheap </a> 
<a href=" http://howtogetviagrawithoutadoctorprescription.com/ ">how to get viagra without a doctor prescription </a>
Mdxx83u 1 semana
signs of an std for females national healthcare act 
http://www.viagrawithoutdoctor.com/#mvagp.html 
viagra without a doctor prescription std symptom checker 
<a href="http://www.viagrawithoutdoctor.com/">viagra online without prescription</a> 
gov healthcare plans 
http://viagrawithoutdoctor.com/ viagra without a doctor prescription 
cheap health care
uhuofq 1 semana
medical education edinburgh contents of first aid kit 
http://viagra-generic.us.com/ 
generic viagra legal genesis medical education 
<a href="http://viagra-generic.us.com/">generic viagra</a> 
health insurance in us 
http://www.viagra-generic.us.com/ - buy viagra 
the medical school
Icae46r 1 semana
signs of a venereal disease stroke emergency treatment 
http://genericallyviagra.com/ - best price generic viagra 
buy viagra online signs of heat stress 
<a href="http://genericallyviagra.com/">viagra samples</a>
sadwwj 6 días, 14 horas
family medical insurance quotes cpr first aid certification 
http://genericsviagra.top/ - viagra canada generic 
viagra first aid trainer 
<a href="http://genericsviagra.top/">viagra online</a>
Irshgwe 6 días
cheap health care insurance symptoms of heat stroke and heat exhaustion 
http://genericsildenafil.top/ - generic viagra 
viagra samples list of std symptoms 
<a href="http://genericsildenafil.top/">buy viagra</a>
DonaldteW 5 días, 9 horas
<a href=http://vardenafilprixenpharmacieacaen.com/>levitra prix en pharmacie france </a> 
<a href=" http://vardenafilprixenpharmacieacaen.com/ ">levitra generique prix en pharmacie </a>
duocdk 5 días, 3 horas
sti symptoms chart heat stroke symptoms in elderly 
http://genericforviagra.top/ - generic viagra 
buy viagra online medical education england 
<a href="http://genericforviagra.top/">generic viagra for sale</a>
jsy42l 5 días
2015 medical school rankings medical education edinburgh 
http://canadianpharmacies.org/ 
online pharmacy journals on medical education 
<a href="http://canadianpharmacies.org/">international pharmacy</a> 
common symptoms of stds 
http://canadianpharmacies.org/ canadian pharmacy 
diploma in medical education
Mrbbifu 4 días, 17 horas
do stds have symptoms individual health insurance providers 
http://www.rxsildenafilcanada.com/#kaabn.html 
viagra generic all std diseases 
<a href="http://www.rxsildenafilcanada.com/">cialis vs viagra</a> 
pediatric cpr 
http://www.rxsildenafilcanada.com/ cialis vs viagra 
sti transmission
Iqoxdhs 4 días, 7 horas
first aid instructor course insurance health 
http://genericviagrausa.top/ - viagra generic 
buy viagra online online medical education courses 
<a href="http://genericviagrausa.top/">buy viagra online</a> 
health insurance health 
http://genericviagrausa.top/ - viagra online 
medical education grants
vbhd34 3 días, 11 horas
treatment of heat stroke heat stroke mild 
http://viagrabuy.top/ - buy viagra 
buy viagramedical doctor education 
<a href="http://viagrabuy.top/">buy viagra</a> 
list of std symptoms and treatments
fatbmc 3 días, 2 horas
cialis vs viagra list of std disease 
<a href="http://discountsildenafil.top/">viagra coupon</a> 
united benefits health insurance 
<a href=http://discountsildenafil.top/>buy viagra</a>
yemyzi 2 días, 20 horas
viagra canada symptoms for heat exhaustion 
<a href="http://canadaviagra.top/">viagra coupons</a> 
prerequisites for medical school 
<a href=http://canadaviagra.top/>viagra samples</a>
Yjooxgz 19 horas, 13 minutos
http://viagrabonusonline.com/ - generic viagra 
www director of medical education 
<a href=http://viagrabonusonline.com/>viagra cheap</a> 
aca health insurance 
http://viagrabonusonline.com/ buy viagra 
cpr certification
bgr70d 2 días, 12 horas
symptoms of sti in females 
http://buyviagra-online.top/ 
buy viagra signs of stds for males 
<a href="http://buyviagra-online.top/">viagra buy</a> 
std diagnosis 
http://buyviagra-online.top/ buy viagra
Ueqit26 2 días, 6 horas
affordable health care in florida 
http://genericviagrawithoutadoctor.com/#viagra-without-subscription-nekmo.com 
aua medical school 
<a href=http://genericviagrawithoutadoctor.com/>viagra without a doctor's prescription</a> 
individual health quotes 
http://genericviagrawithoutadoctor.com/ viagra cost without insurance 
the affordable care act
ZacharyMaive 2 días, 4 horas
<a href= http://www.novschool8.ru/index/8-19937 >novschool8 ru</a> <a href= http://www.podbol.ru/index/8-18874 >podbol ru</a> <a href= http://build-in.com.ua/wr_board/tools.php?event=profile&pname=0Katermi >build in com ua</a> <a href= http://m2motors.com.ua/forum/user/0KaterEa/ >m2motors com ua</a> <a href= http://rossbanki.ru/user/0KaterSr/ >rossbanki ru</a> <a href= http://judoinfo.kiev.ua/forum/member.php?action=profile&uid=117925 >judoinfo kiev ua</a> <a href= http://gd.kz/pro/dle101/user/0KaterSi/ >gd kz</a> <a href= http://bulgariatour.by/users/0Katersr >bulgariatour by</a> <a href= http://old.sysertonline.ru/users/0KaterPr >old sysertonline ru</a> <a href= http://ua.f-transfer.ru/user/0Katerma/ >ua f transfer ru</a> <a href= http://kubano.ru/users/0Katersn >kubano ru</a> <a href= http://www.iz-solnechnoi-harmonii.by/forums/user/0katerkt/ >iz solnechnoi harmonii by</a> <a href= http://www.kidsfeet.ru/index/8-31670 >kidsfeet ru</a> <a href= http://bestschool60.3dn.ru/index/8-16569 >bestschool60 3dn ru</a> <a href= http://zheldor.su/users/0KaterEi >zheldor su</a> <a href= http://www.zoobiz.ru/board/tools.php?event=profile&pname=0KaterSt >zoobiz ru</a> <a href= http://free-ringtone.ru/index/8-34287 >free ringtone ru</a> <a href= http://vrbsh.ucoz.ru/index/8-21464 >vrbsh ucoz ru</a> <a href= http://pet-forum.ru/member.php?action=profile&uid=5942 >pet forum ru</a> <a href= http://www.mu-ckd.ru/user/0Katerea/ >mu ckd ru</a> <a href= http://fortune-log.kz/user/0Katersa/ >fortune log kz</a> <a href= http://autokop.ru/doska/tools.php?event=profile&pname=0KaterOt >autokop ru</a> <a href= http://allcs.csmoni.ru/user/0Katerst/ >allcs csmoni ru</a> <a href= http://doctor-mrt.ru/index/8-78201 >doctor mrt ru</a> <a href= http://netcity.ucoz.ru/index/8-12068 >netcity ucoz ru</a> <a href= http://region24.pp.ua/users/0KaterPr >region24 pp ua</a> <a href= http://lomonosov.karasaimektep.kz/user/0Katermn/ >lomonosov karasaimektep kz</a> <a href= http://umnits.com.ua/users/0Kateroi >umnits com ua</a> <a href= http://www.xenon.co.ua/forum/index.php?/user/18225-0katerol/ >xenon co ua</a> <a href= http://bitcoinmoney.ru/user/0Kateron/ >bitcoinmoney ru</a> <a href= http://drawschool.ru/users/0Katerot >drawschool ru</a> <a href= http://inform402.spb0.ru/users/0KaterMr >inform402 spb0 ru</a> <a href= http://kapitalists.ru/users/0Katersa/ >kapitalists ru</a> <a href= http://dnr24.su/user/0Katermn/ >dnr24 su</a> <a href= http://e-use.ru/user/0KaterEt/ >e use ru</a> <a href= http://rus-microsoft.ru/user/0KaterKn/ >rus microsoft ru</a> <a href= http://www.xenon.co.ua/forum/index.php?/user/18225-0katerol/ >xenon co ua</a> <a href= http://sanfteam.ru/user/0KaterMi/ >sanfteam ru</a> <a href= http://appu.te.ua/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=24850 >appu te ua</a> <a href= http://hod.clan.su/index/8-18520 >hod clan su</a>
Iekk73e 2 días, 3 horas
viagra price red cross cpr certification 
<a href="http://viagraprices.top/">viagra 100 mg best price</a> 
male chlamydia 
<a href=http://viagraprices.top/>viagra pricing 100mg walmart</a>
Yegch52 1 día, 23 horas
std and sti 
http://withoutadoctorprescriptionviagra.net/#viagra-without-ed-nekmo.com 
what causes sti 
<a href=http://withoutadoctorprescriptionviagra.net/>brand viagra without a doctor prescription</a> 
cheap private insurance 
http://withoutadoctorprescriptionviagra.net/ viagra without a doctor prescription 
baby first aid
nuuuddee 1 día, 19 horas
Забаньте эти интимные подборки нудистов без презика 
http://nude.hidden-camera-porn.ru/
Iwgndwk 1 día, 5 horas
cold stroke first aid can heat stroke cause a seizure 
http://withoutdoctorsprescriptionviagra.org/#viagra-without-see-a-doctor-nekmo.com 
viagra without a doctor prescription best medical school for me 
http://withoutdoctorsprescriptionviagra.org/ - viagra without a doctor prescription 
medical school financial aid 
<a href=http://withoutdoctorsprescriptionviagra.org/>viagra without a doctor's prescription</a>
Ycqeu77 1 día, 3 horas
remedies for heat stroke 
http://withoutadoctorsprescriptionviagra.org/#buy-prescription-viagra-nekmo.com 
free medical insurance 
<a href=http://withoutadoctorsprescriptionviagra.org/>viagra without a doctor prescription</a> 
caribbean medical school rankings 
http://withoutadoctorsprescriptionviagra.org/ viagra without a doctor prescription 
symptoms for stds in females
fxlk79 13 horas, 39 minutos
home first aid kit masters medical education 
http://genericviagradoc.com/#viagra-generic-nekmo.com 
generic viagra basic first aid course 
http://genericviagradoc.com/ - generic viagra for sale 
best individual health insurance plans 
<a href=http://genericviagradoc.com/>buy viagra</a>