Bir Python betiğini dizinine cd olmadan ing komutundan nasıl alabilirim? PYTHONPATH mı?


157

PYTHONPATH'ı nasıl kullanabilirim? Yolda bir komut dosyası çalıştırmayı denediğimde dosya bulunamadı. Komut dosyasını tutan dizine cd yaptığımda komut dosyası çalışır. PYTHONPATH ne işe yarar?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Sonra dosya dizinine cd çalışır ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

PYTHONPATH'ı neden kullanamıyorum?


1
Bu yayının başlığını değiştirebilir miyiz? Aslında bir açıklama istemiyor PYTHONPATH.
Nico Cernek

Başlık düzenlendi çünkü bu googling zaman ortaya çıkan ilk şeyPYTHONPATH
raphael

Yanıtlar:


194

Sanırım biraz kafan karıştı. PYTHONPATH , çalıştığınız gibi yürütmek için değil, python modüllerini içe aktarmak için arama yolunu ayarlar .

PYTHONPATH Modül dosyaları için varsayılan arama yolunu çoğaltın. Biçim, kabuğun PATH'si ile aynıdır: os.pathsep ile ayrılmış bir veya daha fazla dizin yol adı (örn. Unix'teki sütunlar veya Windows'ta noktalı virgüller). Varolmayan dizinler sessizce göz ardı edilir.

Normal dizinlere ek olarak, tek tek PYTHONPATH girişleri saf Python modülleri (kaynak ya da derlenmiş biçimde) içeren zip dosyalarına atıfta bulunabilir. Genişletme modülleri zip dosyalarından içe aktarılamaz.

Varsayılan arama yolu kuruluma bağlıdır, ancak genellikle önek / lib / pythonversion ile başlar (bkz. Yukarıdaki PYTHONHOME). Her zaman PYTHONPATH'a eklenir.

PYTHONPATH önündeki arama yoluna yukarıda Arayüz seçenekleri altında açıklandığı gibi ek bir dizin eklenir. Arama yolu bir Python programından sys.path değişkeni olarak değiştirilebilir.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Aradığın şey PATH.

export PATH=$PATH:/home/randy/lib/python 

Ancak, python betiğinizi bir program olarak çalıştırmak için , ilk satırda Python için bir shebang ayarlamanız gerekir . Böyle bir şey işe yaramalı:

#!/usr/bin/env python

Ve yürütme ayrıcalıkları verin:

chmod +x /home/randy/lib/python/gbmx.py

O zaman gmbx.pyher yerden koşabilmelisiniz .


2
Teşekkürler arkadaşım. Bunu hala ütülüyorum. Betiğim, modüllerimi özel PYTHONPATH'ımdan içe aktarmayı başardı. Ve şimdi farkı anlıyorum: her şey komut dosyası ile modül arasında; komut dosyası çağrısı vs python içe aktarma. Evet, aslında kullanacağımexport PATH=$PATH:/home/etc
Randy Skretka

57

PATH ve PYTHONPATH kafalarını karıştırıyorsunuz. Bunu yapmanız gerekir:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH, python yorumlayıcısı tarafından hangi modüllerin yükleneceğini belirlemek için kullanılır.

PATH, hangi yürütülebilir dosyaların çalıştırılacağını belirlemek için kabuk tarafından kullanılır.


38

PYTHONPATHyalnızca importifadeleri etkiler , üst düzey Python yorumlayıcısının bağımsız değişken olarak verilen python dosyalarını aramasını etkilemez .

PYTHONPATHAyarlanmaya ihtiyaç duymak harika bir fikir değildir - çevre değişkenlerine bağımlı olan her şeyde olduğu gibi, işleri farklı makineler arasında tutarlı bir şekilde kopyalamak zorlaşır. Daha iyisi, Python'un zaten bildiği sisteme bağlı yollara kurulabilen ('pip' veya distutils kullanılarak) Python 'paketlerini' kullanmaktır.

Bir okuma var https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ ve ayrıca, 'Ambalaj Otostopçunun Kılavuzu' - http://docs.python.org/3/tutorial /modules.html - PYTHONPATH ve paketleri daha düşük bir seviyede açıklar.


Alınan nokta. Bu özel durumda PYTHONPATH eklenmesi iyi çalışıyor gibi görünüyor. Bir makinede bir kullanıcı olarak, önceden yazılmış bazı .py kodlarını kullanabilir ve tekrar kullanabilirim.
Randy Skretka

1
Dürüst olmak gerekirse, sisteme bağımlı yollara bir şeyler yüklemenin, root erişiminin gerekli olduğu, kullanmaktan daha iyi bir fikir olduğunu düşünmüyorum PYTHONPATH. Artık pip installkök erişim olmadan bir ana bilgisayarda düzenli bir kullanıcı olduğum şeyde ısrar eden temel bir Python programıyla kaç kez uğraştığımı saymıyorum (pip yerel kurulum yapabilir). ayrıca pip olmadan. İşte Python yazılımını dağıtan herkese bir tavsiye - önce root erişimi olmayan ve sadece pip olmadan çekirdek Python dağıtımına sahip olmayan bir vanilya Linux ana bilgisayarına kendi yazılımınızı kurmaya çalışın.
amn

3

Sanırım PATH ve PYTHONPATH arasında karışıksın. Bir 'script' çalıştırmak için yapmanız gereken tek şey, PATH değişkeninize eklenmiş bir ebeveyn dizinidir. Bunu çalıştırarak test edebilirsiniz

which myscript.py

Ayrıca, myscripy.pyözel modüllere bağlıysa, ebeveyn dizinleri de PYTHONPATH değişkenine eklenmelidir. Ne yazık ki, python tasarımcıları açıkça uyuşturucu kullandığından, ithaldeki ithalatın aşağıdakilerle test edilmesi, PYTHONPATH'ınızın bir komut dosyasında kullanım için doğru ayarlandığını garanti etmez. Python programlamanın bu kısmı sihirlidir ve yığın akışı üzerinde uygun şekilde cevaplanamaz.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

PYTHONPATH örneğinizdeki gibi ayarlandığında,

python -m gmbx

-mseçeneği, Python'un modüllerinizde Python aramasını Python genellikle PYTHONPATH'a ekledikleriniz dahil olmak üzere modülleri arar. Gibi yorumlayıcı çalıştırdığınızda python gmbx.py, belirli bir dosya arar ve PYTHONPATH uygulanmaz.

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.