DistutilsOptionError: ev veya önek / exec-öneki sağlamalıdır - her ikisini birden değil


144

Genellikle pip yoluyla python paketleri kurdum.

Google App Engine için paketleri başka bir hedef dizine yüklemem gerekiyor.

Denedim:

pip install -I flask dinlendirici - hedef ./lib

ama başarısız oluyor:

ev veya önek / exec-öneki sağlamalıdır - her ikisini birden değil

Bunu nasıl çalıştırabilirim?

Yanıtlar:


289

OS X ve Homebrew kullanıyor musunuz? Homebrew python sayfası https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md pip ile ilgili bilinen bir sorunu ve etrafındaki bir çalışmayı çağırır.

Benim için çalıştı.

Aşağıdaki içeriğe sahip bir ~ / .pydistutils.cfg dosyası ekleyerek bu "boş öneki" varsayılan yapabilirsiniz:

[install]
prefix=

Düzenleme: Bu Homebrew önerilen seçeneğini kullanmayın, normal pip operasyonlarını kıracaktır .


5
iyi şeyler, bağlantı kötü, beklediğim yeni bu: github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
patt0

6
Bu dosyanın benim için sanal ortamı bozduğunu unutmayın.
Dmytro Sadovnychyi

16
Bu boş önek iş normal pip installişlemleri bozar :(
Jaap

10
Herkes anladım nasıl izin --targetederken değil varsayılan mahvediyor pip installdavranışı?
ryantuck

3
Bu artık geçerli görünmüyor. Bağlantı koptu ve güncellenen bağlantı pydistutils.cfg hakkında konuşmuyor
Lucretiel

164

Normal pip operasyonlarınızı bozmayacak bu soruna (Homebrew'un macOS'daki Python) daha basit bir çözümü olduğuna inanıyorum.

Tek yapmanız gereken setup.cfg, genellikle ana __init__.pyveya yürütülebilir py dosyanızın olduğu yerde projenizin kök dizininde bir dosya oluşturmaktır . Projenizin kök klasörü şuysa: içinde /path/to/my/project/bir setup.cfgdosya oluşturun ve içindeki sihirli kelimeleri yerleştirin:

[install]
prefix=  

Tamam, şimdi bu klasör için pip komutlarını çalıştırabileceksiniz:

pip install package -t /path/to/my/project/  

Bu komut yalnızca bu klasör için incelikle çalışır. setup.cfgYapabileceğiniz diğer projelere kopyalamanız yeterlidir. .pydistutils.cfgAna dizininize a yazmanıza gerek yoktur .

Modülleri kurmayı tamamladıktan sonra kaldırabilirsiniz setup.cfg .


2
Bu pip3.6 ile de mükemmel çalıştı. Ve pip'im hala sağlam.
Hannibal

10
Bu kabul edilen cevap olmalı. Global pip ayarlarıyla ilgili sorunlara neden olmaz.
TrinitronX

10
setup.cfgkurulum sonrası kaldırmaya vurgu . Sanal gün ortamımın neden hata yaptığını anlamaya çalışırken 2 gün boyunca yanmıştım Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'. Kurulum dosyasını kaldırmak benim
aklıma

1
@ kip2 evet haklı olarak sizin tarafınızdan not edildi, bu yüzden cevabı bu kısmı vurgulamak için düzenledim, AndreG lütfen unutmayın.
bool.dev

Kaydettiğiniz için teşekkürler. "Modülleri kurmayı tamamladıktan sonra setup.cfg dosyasını kaldırmalısınız" dersem daha doğru olur mu?
AndreG

25

OSX'te (mac), / var / myproject adında bir proje klasörü olduğu varsayılarak

  1. cd /var/myproject
  2. Adlı bir dosya oluşturun setup.cfgve ekleyin [install] prefix=
  3. Çalıştırmak pip install <packagename> -t .

1
Bunun @AndreG cevabından nasıl farklı olduğundan emin değilim
Alastair McCormack

Benim için fark bu çözüm cd dizin içine ve -t .dir dışında kalmak yerine. Bu şekilde benim için çalıştı ve diğeri işe yaramadı, ancak neden olduğu hakkında hiçbir fikrim yok.
Chuck Wilbur

12

Homebrew kullanıcıları için başka bir çözüm * basitçe kullanmaktır virtualenv.

Tabii ki olabilir ama öyle değil bile buldum - yine hedef dizininde ihtiyacını ortadan kaldırmak --targetzaman sanal ortamda (bir yapılandırma dosyası oluşturarak / değiştirmeden, olduğu gibi) varsayılan olarak çalışmalarını.


* Çözüm diyorum; belki de venvleri titizlikle kullanmak başka bir motivasyon ...


3
Bunun sadece bir ay önce olduğuna inanamıyorum. Sadece kendi sorumu cevaplarken kendimi yakaladım; vaktinden önce ...
OJFord

Son zamanlarda OP'nin sorusundaki problemi yaşadım ve sadece bir sanalenv oluşturmak sorunu benim için çözdü. Yine de hedef dizine yüklenebilirim. Sorunum ek olarak karmaşıktı çünkü ben de python3 yükledim, ancak sanalenv çözümü için +1.
Josh Brown

3

Etraftaki diğer önerilerle ilgili hatalara çarptım --install-option="--prefix=lib". İşe yaradığını bulduğum tek şey buradaPYTHONUSERBASE açıklandığı gibi kullanmaktır .

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

bu tam olarak aynı değildir --target, ancak her durumda benim için hile yapar.


2

Diğer bahsedildiği gibi, bu homebrew ile yüklü pip & python ile bilinen bir hatadır.

Eğer yaratırsan ~/.pydistutils.cfg"Boş önek" talimatı içeren bir dosya bu sorunu giderir, ancak normal pip işlemlerini bozar.

Bu hata resmi olarak giderilene kadar, seçeneklerden biri bu davayı ele alacak kendi bash betiğinizi oluşturmak olacaktır:

 #!/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

Bu komut dosyası komutunuzu sarar ve:

  1. isim ve hedef parametrelerini kabul eder
  2. bu parametrelerin boş olup olmadığını kontrol eder
  3. yaratır ~/.pydistutils.cfgiçinde "boş önek" talimatı olan bir dosya
  4. pip komutunuzu sağlanan parametrelerle yürütür
  5. ~/.pydistutils.cfgdosyayı kaldırır

Bu komut dosyası ihtiyaçlarınızı karşılayacak şekilde değiştirilebilir ve uyarlanabilir, ancak fikir sahibi olursunuz. Ve komutunuzu pip frenlemeden çalıştırmanıza izin verir. Umarım yardımcı olur :)


2

Virtualenv * kullanıyorsanız, kullandığınızın iki kez kontrol edilmesi iyi bir fikir olabilir which pip.

/usr/local/bin/pipÇevrenizden kopmuş gibi bir şey görürseniz . Virtualenv'inizi yeniden etkinleştirmek şu sorunu çözer:

vIRTUALENV: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: Sanal balık kullanıyorum, ancak bu ipucunun her ikisiyle de alakalı olduğunu varsayıyorum.


Virtualenv kullanmak aslında benim benzer durumda çözüm oldu :)
chriscatfr

-1

Benzer bir sorunum var. Burada durumumun özel durumunu açıkladığım diğer iş parçacığına karar verirken --system bayrağı hata önlemek için kullanın . Bunu aynı sorunla karşılaşan herkese yardımcı olabileceğini umarak buraya gönderiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.