#python #pip
#python #pip
Вопрос:
Ниже приведена ошибка, которую я получаю при запуске pip
:
serkan$ rm -r mysite
serkan$ pwd
/Users/serkan/Desktop/Python Folder
serkan$ virtualenv mysite
New python executable in mysite/bin/python
Installing setuptools............done.
Installing pip...............done.
serkan$ source mysite/bin/activate
(mysite)serkan$ pip install pinax
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$ python pip install pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ pip
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$ pip install Pinax
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$
Ответ №1:
Создайте свою среду virtualenv в пути без пробелов. Вот почему это происходит:
Когда вы создаете среду, она устанавливает bin
каталог. В этом bin
каталоге находятся все исполняемые файлы, относящиеся к среде. Некоторые из них являются скриптами. Как вы, возможно, знаете, хэш-коды используются для указания системе, какой интерпретатор использовать для запуска скрипта. Вы можете часто видеть это в верхней части скриптов:
#!/usr/bin/env python
Если скрипт находится в состоянии at /tmp/test.py
, это указывает системе выполнить эту команду для выполнения скрипта:
/usr/bin/env python /tmp/test.py
В вашем случае virtualenv создает сценарии, подобные этому:
#!/tmp/oh no/bin/python
Когда система попытается выполнить это, она попытается выполнить команду /tmp/oh
с аргументами no/bin/python
и /tmp/test.py
. /tmp/oh
не существует, поэтому он завершается с ошибкой.
Комментарии:
1. «Создайте свою среду virtualenv в пределах пути без пробелов». Вот что помогло! Спасибо.
2. У меня была та же ошибка, но без пробелов, оказывается, меня поразило то, что вы не можете переместить virtualenv после создания (что является полным безумием …).
3. @alper: это как бы поддерживает их перемещение.
4. Спасибо, это все объяснило мне! Я предполагаю, что это означает, что вы не можете настроить virtualenvs внутри папки Google Drive.
5. @GChorn: это было бы немного взломом, но вы могли бы установить символическую ссылку в пути без пробелов к папке Google Drive.
Ответ №2:
Для тех, кто столкнулся с этой проблемой, я обнаружил, что длина пути также может вызвать проблемы без использования каких-либо пробелов (Ubuntu 12.04):
virtualenv /home/user/some/very/longer/path/without/spaces/etc/venv
сбой, в то время как
virtualenv /home/user/some/very/long/path/without/spaces/etc/venv
сработало просто отлично, см. Комментарий Алекса ниже
Комментарии:
1. Это не ограничение bash и фактически не имеет ничего общего с оболочками: это ограничение ядра в вызове exec на длину, разрешенную для указания интерпретатора (и аргументов) после магического числа «#!». Исторически это было около 30 символов в старом Unixen, в Linux это ближе к 80.
2. 🙂 Теперь, если мы можем просто заставить людей перестать указывать .sh в именах команд. Это ооочень неправильно по многим причинам.
3. Просто чтобы уточнить, ограничение ядра — BINPRM_BUF_SIZE, а предельная длина — 127 байт. Дополнительная информация: in-ulm.de /~маскировка/различная/шебанг/#длина
Ответ №3:
pip
команда не будет работать, если:
- Вы не установили pip в своей системе. (вы должны сначала установить pip в своей системе, прежде чем сможете использовать его в virtualenv. Для установки
pip
в Ubuntu используйте командуsudo apt-get install python-pip
илиsudo apt-get install python3-pip
) - Путь к папке вашей виртуальной среды содержит пробелы.(Пример: /home/имя пользователя/имя моей папки с пробелами/newvirtualenv)
- Пример: /home/username/mytoobigpath/somefolder/anotherfolder/someanotherfolder/someanotherfolderagain/myvirtualenv. Путь к папке вашей виртуальной среды слишком длинный. (Попробуйте переименовать родительские папки с меньшими именами)
Если вы по какой-то причине не можете переименовать папки или изменить путь, перейдите yourvirtualenvfolder/bin
(используя cd
command), а затем попробуйте ./python pip install packagename
.
Комментарии:
1. Ты герой. Это немного смешно, что pip не может обрабатывать пробелы и специально не выдает эту ошибку.
2. Столкнулся с проблемой длинного пути. Спасибо.
3. Кто-нибудь знает
virtualenv
ограничение по длине?4. Также столкнулся с ограничением длины из-за имен рабочих областей Дженкинса. Ограничение на количество символов, по-видимому, составляло 79 символов. CentOS7 размещенная на AWS виртуальная машина с ядром версии 3.10.0-693.11.6.el7.x86_64
5. Я должен заменить
python pip install packagename
на./python pip install packagename
, иначе в конечном итоге будет использоваться системный python, а не тот, что в virtualenv. Я не могу отредактировать ответ, потому что редактирование составляет менее 6 символов.
Ответ №4:
icktoofay правильно указывает причину.
Чтобы использовать pip с virtualenv в каталоге с пробелами, отредактируйте /path/to/env/bin/pip
, заменив shebang вверху на #!/usr/bin/env python
(или #!/usr/bin/env pypy
, если вы используете pypy).
Обратите внимание, что virtualenv изменяет вашу среду таким образом, что /usr/bin/env python
ссылается на python
определенную virtualenv.
Комментарии:
1. @icktoofay, virtualenv изменяет
PATH
определенноеenv
значение . Таким образом,/usr/bin/env python
будет ссылаться наpython
определенный virtualenv.2. Вы правы. Сейчас это кажется очевидным, но я по какой-то причине упустил это из виду.
3. Не беспокойся. Я изменил свой ответ, чтобы сделать его более понятным.
4. Спасибо! Где-то в процессе настройки проекта мне сказали изменить имена папок, но я уже создал virtualenv. Теперь он больше не позволял мне использовать pip для установки пакетов. Редактирование исполняемого файла bin / pip и исправление пути к новому имени сделали свое дело! 🙂
Ответ №5:
На Python 3.7 у меня не было никаких проблем с этим, но когда мне пришлось использовать Python 3.6, у меня возникла проблема. Самым простым решением, которое я нашел на Github, было следующее:
Вместо:
pip install -r requirements.txt
Я использую:
python env/bin/pip install -r requirements.txt
Таким образом, вы фактически напрямую указываете на файл pip в каталоге вашей виртуальной среды. Конечно, вам нужно сначала активировать его, прежде чем пытаться это сделать. Надеюсь, это поможет кому-то, кто приходит сюда!
Комментарии:
1. Я не знаю, почему это работает, но это единственное решение, которое сработало для меня. Спасибо!
Ответ №6:
Я получил ту же ошибку RedHat
. Python 2.7.3 настроен и создан мной.
[root@Ifx installer]# pip install Django
-bash: /usr/local/bin/pip: /usr/local/bin/python2.7: bad interpreter: Permission denied
Решение: В /usr/local/bin/pip
замените первую строку #!/usr/local/bin/python2.7
вашим фактическим путем Python #!/root/installer/Python-2.7.5/python
Ответ №7:
У меня была очень похожая проблема на моем компьютере с Windows 7, и я пару дней боролся с этим. В обоих путях, к моему дистрибутиву python и к моим ПЯТИ, были пробелы. За пару месяцев до этого все работало нормально. Я нашел следующую заметку на веб-сайте virtualenv:
**Windows Notes**
[...] To create a virtualenv under a path with spaces in it on Windows, you’ll need the win32api library installed.
Следующие шаги приводят меня к успеху:
- Убедитесь, что я использовал pip для установки virtualenv, и это последняя версия (pip-7.1.0). Результат: сбой.
- Установите win32api. Результат: сбой (хотя в самом конце процесса установки произошла некоторая ошибка).
- Попробуйте установить my VE в путь без пробелов. Результат: сбой.
- Переустановите мой дистрибутив Anaconda python на путь, который не содержит скобок «[» и «]». В пути были пробелы. Результат: сбой.
- Переустановите мой дистрибутив Anaconda python на путь, который также не содержит пробелов. Путь к папке VE по-прежнему содержал пробелы. Результат: успех!
Так что, по крайней мере, простой, не загрязняющий пространство путь установки Anaconda (python) имел решающее значение. Возможно, установка win32api также была важна. Не уверен.
Ответ №8:
Я нашел это из поиска Google, столкнувшись с той же проблемой, и обнаружил, что это очень полезно. virtualenv
теперь есть --relocatable
флаг, который перепишет команду shebang на #!/usr/bin/env <the_python_version_you_used_to_create_the_virtualenv>
. В нем есть некоторые оговорки, поэтому обязательно прочитайте документацию, чтобы понять последствия:
https://virtualenv.pypa.io/en/stable/userguide/#making-environments-relocatable
Для перемещения virtualenv необходимо использовать тот же синтаксис, что и при его создании, в противном случае версия python может быть перезаписана. Это будет работать так, как ожидалось…
virtualenv --python=python3.5 env-test
virtualenv --relocatable --python=python3.5 env-test
в то время как это приведет к #!/usr/bin/env python2.7
(по крайней мере, в моей локальной среде)…
virtualenv --python==python3.5 env-test
virtualenv --relocatable env-test
Комментарии:
1. Это не решает проблему для меня
Ответ №9:
В моем случае деактивируйте среду и source bin/activate
снова работает.
Кажется, содержимое моей папки имеет те же имена вложенных папок, что и сгенерированные virtualenv
, например, bin, lib и т.д. И после копирования в мои файлы повторно активируйте среду let virtualenv
для обновления новой информации.
Ответ №10:
Если это в Windows, это может быть вызвано изменениями dll (другим программным обеспечением) Установка OpenSSL исправит это. https://slproweb.com/products/Win32OpenSSL.html
Он автоматически обновит dll до более новых версий.
Комментарии:
1. Ошибка ясно показывает, что это связано с ошибкой в hashbang (она была устранена). Пожалуйста, внимательно прочитайте, прежде чем публиковать быстрый ответ.