python == python2 VEYA python == python3? Python py2k betikleri nasıl paketlenir, dağıtılır?


10

Sisteme bağlı olarak python== python2veya python== python3.

Yürütülebilir Python komut dosyaları:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Python py3k için belgelerinde sağlanır / sürüm numarası ile kullanabilirsiniz , bu yüzden bunu yapmak:

#!/usr/bin/env python3

Ama py2k komut dosyalarında bir sorun buldum.

İken py2k belgelere kullanımda yazılır: #! /usr/bin/env python,

bazı * nix-es python py3k varsayılan olarak, bu nedenle python == python3. (Örneğin ArchLinux python paketi , burada python paketi dosyaları ).

Python betiklerini bununla başa çıkacak şekilde nasıl paketleyebilir (yapılandırabilir, oluşturabilir) ve / veya hazırlayabilirim?

Kullanıcılar tarafından (ortamlarını değiştirmeden) kolayca çalıştırılabilecek yazılım paketleri yapmayı istiyorum

Python py2k betikleri için aynı hileyi yapabilir ve şu şekilde ayarlayabilir #!/usr/bin/env python2miyim? Her python py2k dağıtımının python2dosya içerdiğinden emin olabilir miyim #!/usr/bin/env python2?

Evet ise, neden standart olarak önerilmemektedir, örneğin python py2k belgelerinde ?


4
Bildiğim kadarıyla her zaman python2çalıştırmak için kullanabilirsiniz (yüklü ise) ve alwayes sürümünü kontrol edebilirsiniz python -V. python2 veya 3 olmasını istiyorsanız, rm /usr/bin/pythondesierd python sürümünüzden işaret eden symlink oluşturmalısınız ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.

Beni temin ettiğin için teşekkürler python2. Acaba neden py2k ve py3k olduğunda kullanmak standart değil ve varsayılan pythonfarklı olabilir. Hakkında tavsiyen ne olacak çıkarmadan - bu örneğe uygun değil, ben ambalaj hakkında sormak neden olur. Farklı konfigürasyonlarda / sistemlerde çalışabilen paket yapmak istiyorum. Çevreyi değiştirmenin yolu yok. Kontrol hakkında ne - bildiğim kadarıyla - Shebang için geçerli değildir .
Grzegorz Wierzowiecki

@Hanan N.'nin anlatmaya çalıştığına inanıyorum ki Python 2.x kodunu yazıyorsanız #!...python2, programlarınızda ve Python 3.x kullanıyorsanız o zaman kullanın #!...python3. Yalnızca belirli bir sürümde çalışacağını biliyorsanız, doğru bağlantıya sahip olmak için işletim sistemine güvenmeyin. Hala Python 1.5.2 olarak yüklü olan sistemlerle çalışıyorum /usr/bin/python- Eski Python sürümlerini işlemek için kod yazıyorum veya kullanıyorum python2.
Arcege

2
@Arcege Sistemimde bir python2yürütülebilir dosya yok (Debian sıkma). pythoniçin bir sembolik python2.6ve python3bir sembolik python3.1, ancak yok python2.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


3

Bir komut dosyası Python sürümünü kontrol edebilir ve bu Python 3 ise, Python 2'yi kullanarak kendini yeniden başlatabilir.

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Bu , ortamın whichyerini bulmak için sistemin komutunu kullanır . Daha sonra kendisini bununla yeniden başlatır (veya bulamazsa durur).python2PATH

Python 3'te başlayabilmesi için komut dosyasının geçerli Python 3 sözdizimi olması gerektiğini unutmayın.

Ayrıca, herhangi bir çıkış execvçağrıdan önce temizlenmelidir yoksa kaybolur. Örneğin, sys.stdout.flush()çağrıdan hemen önce eklemek ifadeleri execvtemizler print.


1

Eski sürümlerde, pythonbunun yerine olabilir python2. Sheebang hattınızı daha net hale getirmek için python2 -> python, kullanabileceğiniz bir bağlantı oluşturabilirsiniz #!/usr/bin/env python2.


Ancak belirtilen sorunu çözmez. Soru, betiğinizin yeterince taşınabilir hale getirilmesi olduğundan, bahsedilen tüm ortamlarda ("python" "python2" vb.)
Çalışabilir

1

Bence "standart" https://www.python.org/dev/peps/pep-0394/

Bu PEP, Python yorumlayıcısının varsayılan sürümüne (yani python komutu tarafından çağrılan sürüme) bakılmaksızın Python komut dosyalarının * nix sistemlerinde taşınabilir olmaya devam etmesini sağlamak için bir kural sağlar.

  • python2, Python 2.x'in bazı sürümlerine atıfta bulunacaktır.
  • python3, Python 3.x'in bazı sürümlerine atıfta bulunacaktır.
  • şimdilik tüm dağıtımlar python'un python2 ile aynı hedefe atıfta bulunmasını sağlamalıdır.
  • ancak, son kullanıcılar python'un en azından Arch Linux'ta (bu değişiklik bu PEP'in oluşturulmasını isteyen şeydir) python3'ü ifade ettiğinin farkında olmalıdır, bu nedenle python sadece her iki Python 2 ile uyumlu kaynak kodları için shebang satırında kullanılmalıdır ve 3.
  • Python'un varsayılan sürümünde nihai bir değişikliğe hazırlanırken, yalnızca Python 2 komut dosyalarının Python 3 ile kaynak uyumlu olacak şekilde güncellenmesi veya shebang satırında python2 kullanılması için güncellenmesi gerekir.
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.