Python kodunun -m seçeneğiyle veya değil çalıştırılması
-m
Bayrağı kullanın .
Bir komut dosyanız olduğunda sonuçlar hemen hemen aynıdır, ancak bir paket geliştirdiğinizde, -m
bayrak olmadan, paketteki bir alt paket veya modülü ana giriş olarak çalıştırmak istiyorsanız, içe aktarımların düzgün çalışmasını sağlamanın bir yolu yoktur. programına işaret et (ve inan bana denedim.)
Dokümanlar
Gibi -M bayrak dokümanlar söz hakkından:
Adlandırılmış modül için sys.path'i arayın ve içeriğini __main__
modül olarak çalıştırın .
ve
-C seçeneğinde olduğu gibi, mevcut dizin sys.path'in başlangıcına eklenecektir.
yani
python -m pdb
kabaca eşdeğerdir
python /usr/lib/python3.5/pdb.py
(mevcut dizininizde pdb.py adında bir paketiniz veya komut dosyanız olmadığı varsayılarak)
Açıklama:
Davranış, komut dosyalarına "kasıtlı olarak benzer" yapılır.
Birçok standart kütüphane modülü, çalıştırıldıklarında bir komut dosyası olarak çağrılan kodu içerir. Bir örnek, timeit modülüdür:
Bazı python kodlarının bir modül olarak çalıştırılması amaçlanmıştır : (Bu örneğin komut satırı seçeneği doc örneğinden daha iyi olduğunu düşünüyorum)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
Ve Python 2.4 için sürüm notu vurgularından :
-M komut satırı seçeneği - python -m modulename, standart kitaplıkta bir modül bulur ve onu çağırır. Örneğin python -m pdb
, eşdeğerdirpython /usr/lib/python2.4/pdb.py
Takip Sorusu
Ayrıca, David Beazley'in Python Temel Referansı, bunu "-m seçeneği __main__
, ana betiğin yürütülmesinden önce modülün içinde çalışan bir betik olarak bir kitaplık modülünü çalıştırır" şeklinde açıklar .
Bu, import deyimi ile arayabileceğiniz herhangi bir modülün programın giriş noktası olarak çalıştırılabileceği anlamına gelir - eğer bir kod bloğu varsa, genellikle sonuna yakın bir kod bloğu varsa if __name__ == '__main__':
.
-m
geçerli dizini yola eklemeden:
Burada başka bir yerde bir yorum şöyle diyor:
-M seçeneğinin geçerli dizini sys.path'e eklemesi de kesinlikle bir güvenlik sorunudur (bkz: önyükleme saldırısı). Bu davranış, Windows'taki kitaplık arama sırasına benzer (yakın zamanda sağlamlaştırılmadan önce). Python'un eğilimi takip etmemesi ve eklemeyi devre dışı bırakmak için basit bir yol sunmaması üzücü. sys.path'e
Bu olası sorunu gösterir - (pencerelerde tırnak işaretlerini kaldırın):
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
-I
Bunu üretim ortamları için kilitlemek için bayrağı kullanın (3.4 sürümünde yeni):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
dan docs :
-I
Python'u yalıtılmış modda çalıştırın. Bu aynı zamanda -E ve -s anlamına gelir. Yalıtılmış modda sys.path ne komut dosyasının dizinini ne de kullanıcının site paketleri dizinini içerir. Tüm PYTHON * ortam değişkenleri de göz ardı edilir. Kullanıcının kötü amaçlı kod enjekte etmesini önlemek için başka kısıtlamalar da getirilebilir.
Ne anlama geliyor __package__
?
Bu, özellikle bu soruyla ilgili olmayan açık göreli içe aktarımlara olanak tanır - bu yanıta bakın: Python'daki "__package__" özniteliğinin amacı nedir?
PYTHONPATH=test python -m foo.bar
geliyor? Ayrıntılı olarak açıklar mısınız lütfen?