J'ai généralement été installé python paquets via pip.
Pour Google App Engine, je dois installer les packages dans un autre répertoire cible.
J'ai essayé:
pip installer -I flask-reposful --target ./lib
mais cela échoue avec:
doit fournir soit la maison ou le préfixe/exec-prefix - pas les deux
Comment puis-je le faire fonctionner?
Utilisez-vous OS X et Homebrew? Le Homebrew python page https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md appelle un problème connu. avec pip et un travail autour.
Travaillé pour moi.
Vous pouvez définir ce "préfixe vide" comme valeur par défaut en ajoutant un fichier ~/.pydistutils.cfg avec le contenu suivant:
[install] prefix=
Edit: N'utilisez pas cette option recommandée par Homebrew, elle interrompra les opérations de pip normales.
Je crois qu’il existe une solution plus simple à ce problème (Python sur MacOS d’Homebrew)] qui ne casse pas vos opérations de pip normales.
Tout ce que vous avez à faire est de créer un setup.cfg
fichier dans le répertoire racine de votre projet, généralement là où se trouve votre principal __init__.py
ou le fichier py exécutable est. Donc, si le dossier racine de votre projet est: /path/to/my/project/
, créer un setup.cfg
file ici et met les mots magiques à l'intérieur:
[install]
prefix=
OK, vous devriez maintenant pouvoir exécuter les commandes de pip pour ce dossier:
pip install package -t /path/to/my/project/
Cette commande s'exécutera normalement pour ce dossier uniquement. Il suffit de copier setup.cfg
à tout autre projet que vous pourriez avoir. Pas besoin d'écrire un .pydistutils.cfg
sur votre répertoire personnel.
Une fois que vous avez terminé l’installation des modules, vous pouvez le supprimersetup.cfg
.
Sur OSX (mac), en supposant un dossier de projet appelé/var/myproject
cd /var/myproject
setup.cfg
et ajouter [install] prefix=
pip install <packagename> -t .
Une autre solution * pour les utilisateurs Homebrew consiste simplement à utiliser un virtualenv
.
Bien sûr, cela peut supprime de toute façon la nécessité du répertoire cible - mais même si ce n'est pas le cas, j'ai trouvé --target
fonctionne par défaut (comme dans, sans créer/modifier un fichier de configuration) dans un environnement virtuel.
* Je dis solution; peut-être est-ce juste une autre motivation pour utiliser méticuleusement les apparences ...
Je frappe des erreurs avec les autres recommandations autour de --install-option="--prefix=lib"
. La seule chose que j'ai trouvée qui a fonctionné utilise PYTHONUSERBASE
comme décrit ici .
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
ce n'est pas exactement la même chose que --target
, mais cela me convient en tout cas.
Comme mentionné précédemment, il s'agit d'un bogue connu de pip & python installé avec homebrew.
Si vous créez ~/.pydistutils.cfg
fichier avec instruction "préfixe vide", il résoudra ce problème mais interrompra les opérations pip normales.
Jusqu'à ce que ce bogue soit officiellement résolu, l'une des options serait de créer votre propre script bash qui gèrerait ce cas:
#!/bin/bash
name=''
target=''
while getopts 'n:t:' flag; do
case "${flag}" in
n) name="${OPTARG}" ;;
t) target="${OPTARG}" ;;
esac
done
if [ -z "$target" ];
then
echo "Target parameter must be provided"
exit 1
fi
if [ -z "$name" ];
then
echo "Name parameter must be provided"
exit 1
fi
# current workaround for homebrew bug
file=$HOME'/.pydistutils.cfg'
touch $file
/bin/cat <<EOM >$file
[install]
prefix=
EOM
# end of current workaround for homebrew bug
pip install -I $name --target $target
# current workaround for homebrew bug
rm -rf $file
# end of current workaround for homebrew bug
Ce script enveloppe votre commande et:
~/.pydistutils.cfg
fichier contenant l'instruction "préfixe vide"~/.pydistutils.cfg
fichierCe script peut être modifié et adapté pour répondre à vos besoins, mais vous en avez une idée. Et cela vous permet d'exécuter votre commande sans pépin de freinage. J'espère que ça aide :)
Si vous utilisez virtualenv *, il peut être judicieux de vérifier deux fois which pip
vous utilisez.
Si vous voyez quelque chose comme /usr/local/bin/pip
vous êtes sorti de votre environnement. Réactiver votre virtualenv corrigera ceci:
VirtualEnv: $ source bin/activate
VirtualFish: $ vf activate [environ]
*: J'utilise virtualfish, mais je suppose que cette astuce est pertinente pour les deux.