So vermeiden Sie, dass bei Verwendung von pip mit virtualenv die Berechtigung verweigert wird

93

Ich versuche, ein Python-Paket mit pipin einer virtuellen Umgebung auf einem Ubuntu-Computer bereitzustellen, stoße jedoch auf ein Problem mit Berechtigungen. Beispielsweise:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

endet durch:

Fehler: '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py' konnte nicht erstellt werden: Berechtigung verweigert

Ich kann nicht sudo, da das Paket global und nicht in der virtuellen Umgebung installiert wird. Ich chowned site-packages; lszeigt nur Verzeichnisse an easy_install, die sich auf pipund setuptoolsbeziehen, und nichts, das sich auf Markdown bezieht.

Wie kann ich ein Paket in einer virtuellen Umgebung bereitstellen, pipohne dass berechtigungsbezogene Fehler auftreten?

Arseni Mourzenko
quelle
Nur um zu verdeutlichen: Haben Sie diese virtuelle Umgebung mit erstellt sudo?
sebastian_oe
@sebastian_oe: Ich glaube ich habe es getan. Ich werde einen neu erstellen, um sicherzugehen.
Arseni Mourzenko
4
Dann könnte dies das Problem sein. Versuchen Sie, eine virtuelle Umgebung ohne zu erstellen sudo.
sebastian_oe
1
@sebastian_oe: Ich habe eine virtuelle Umgebung ohne erstellt sudo. In der Tat wird das Paket jetzt korrekt installiert. Können Sie Ihren Kommentar zu einer Antwort bewerben, damit ich ihn akzeptieren kann?
Arseni Mourzenko
1
Wenn Sie zwischen verschiedenen Benutzern wechseln, stellen Sie sicher, dass Sie einen Benutzer verwenden, der ein virtualenvVerzeichnis besitzt (oder über Schreibzugriff verfügt) , da Sie virtualenvmit anderen Benutzern aktivieren können , Sie jedoch keine Pakete installieren können und Berechtigungszugriff gewähren.
Andrius

Antworten:

106

virtualenvBerechtigungsprobleme können auftreten, wenn Sie das virtualenvas erstellen sudound dann ohne sudoim arbeiten virtualenv.

Wie in Ihrer Frage Kommentar fand heraus, hier ist die Lösung zu schaffen das virtualenvohne sudozu können , arbeiten ohne (insb. Write) darin sudo.

sebastian_oe
quelle
4
Wenn ich es in / opt erstellen möchte, für das sudo erforderlich ist, kann virtualenv ohne sudo nicht installiert werden.
Umair A.
7
@sebastian_oe Ich glaube, ich liebe dich
Nobbynob Littlun
5
Wie erstelle virtualenvich das ohne Sudo?
Tunn
Wenn Sie die virtuelle Umgebung mit erstellt haben sudo, lesen Sie die Antwort von @vingtoft, um zu erfahren, wie Sie sie einfach beheben können, ohne sie neu zu erstellen
David A
103

Lösung:

Wenn Sie die virtuelle Umgebung als root erstellt haben, führen Sie den folgenden Befehl aus:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Dies wird wahrscheinlich Ihr Problem beheben.

Prost

Vingtoft
quelle
1
Dies funktionierte für mich (chown /usr/local/lib/python3.4), außer ich glaube nicht, dass ich eine virtuelle Umgebung als root erstellt hatte, sondern Python3.4 tatsächlich als root installiert hatte. Ich teste noch, aber glauben Sie, dass ich mit dieser Lösung auf weitere Probleme stoßen werde, oder wird dieses Problem die meisten Fehler beheben?
ntk4
3
Wie finden Sie heraus, ob Sie virtualenv oder python als root erstellt haben?
A__
6

In meinem Fall habe ich verwendet mkvirtualenv, aber nicht gesagt, dass ich Python3 verwenden würde. Ich habe diesen Fehler erhalten:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

Es funktionierte nach Angabe von python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
nealmcb
quelle
5

Ich habe meine virtuelle Umgebung nicht mit sudo erstellt. Also traf Sebastians Antwort nicht auf mich. Mein Projekt heißt utils. Ich habe das utilsVerzeichnis überprüft und Folgendes gesehen:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

Wie Sie sehen können, utils.egg-infogehört rootnicht macuser. Deshalb gab es mir permission deniedFehler. Ich musste auch entfernen, /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkda es auch von erstellt wurde root. pip install -e .Nachdem ich diese entfernt hatte, tat ich es erneut und es funktionierte.

AliBZ
quelle
3

Wenn Sie eine virtuelle Umgebung mit root erstellt haben, verwenden Sie diesen Befehl

sudo su

Sie erhalten den Root-Zugriff und können dann Ihre virtuelle Umgebung damit aktivieren

source /root/.env/ENV_NAME/bin/activate
Dinesh Chandra Kumawat
quelle
1

Sie haben die virtuelle Umgebung vor der Verwendung von pip nicht aktiviert .

Probieren Sie es aus mit:

$(your venv path) . bin/activate

Verwenden Sie dann pip -r require.txt für Ihren Hauptordner

jmrueda
quelle
1

Ich habe dies auch (aus Versehen) erlebt, nachdem ich in einer vorhandenen virtuellen Umgebung ein neues Venv erstellt habe. Eine einfache Möglichkeit, dies zu diagnostizieren, besteht darin, zu sehen, wo die pythonVerknüpfung besteht, dh ausführen:

ls -l venv/bin/python

und stellen Sie sicher, dass es auf die entsprechende Python-Binärdatei zeigt. Für die meisten Systeme ist dies /usr/bin/pythonoder /usr/bin/python3. Wenn es auf eine vorhandene virtuelle Umgebung verweist, ist es so etwas wie /home/youruser/somedir/bin/python. Wenn es das letztere ist, würde ich vorschlagen, das Venv neu zu erstellen und gleichzeitig sicherzustellen, dass Sie sich nicht in einem vorhandenen virtuellen Netzwerk befinden (dh ausführen deactivate).

Sam Mason
quelle
hier gepostet, weil es eine beliebte Frage ist, die die entsprechenden Schlüsselwörter erwähnt, daher eher gefunden wird und für andere Leute nützlich ist
Sam Mason
0

Wenn Sie beim Erstellen von virtualenv sudo verwenden, wird das Verzeichnis mit Root-Rechten erstellt. Wenn Sie also versuchen, ein Paket mit einem Nicht-sudo-Benutzer zu installieren, haben Sie keine Berechtigung, es zu installieren. Erstellen Sie also immer virtualenv ohne sudo und installieren Sie es ohne sudo.

Sie können auch auf global python installierte Pakete nach virtualenv kopieren.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
quelle
Dies war nicht das Problem: Wenn Sie die Kommentare lesen, hat das OP die virtuelle Umgebung zunächst mit sudo erstellt.
NickD