2013-01-04 39 views
5

Binlerce sunucu (linux) var, bazıları sadece python 2.x'e ve bazıları sadece python 3.x'e sahip, bir betik yazmak istiyorum check.py, $ python check.py veya $ python3 check.py kullanmadan $./check.py gibi tüm sunucularda çalışabilir, bunu yapmanın herhangi bir yolu var mı?python 2.x ve python 3.x ile çalışan bir python betiğini çalıştırabilirsiniz. 3.x

benim sorum olursa olsun Tercüman Python 3.x Python 2.x ile tamamen geriye uyumlu olmadığını düşünürsek python2.x ve python3.x

+1

emin ... her ikisi de ortak dil yapıları kullandığınız sürece ... –

+0

problem ilk satır #/usr/bin/env python [2.x | 3.x] nasıl yazılır Tercüman bul – xielingyun

+0

Bu neden bir problem? Sadece 'python' çalıştırın; sadece 2.x ile bir sistemde veya 2.x ve 3.x ile 2.x olacaktır; Sadece 3.x ile bir sistemde, 3.x olmalıdır. – abarnert

cevap

13

Birçok komut dosyası hem 2.x hem de 3.x'te çalışabilir. (Ben günlük olarak çalışmak bir grup var ve ben 2.x sadece çift sürümü için çeşitli açık kaynak kütüphaneleri çevirdik.)

birkaç nokta çok daha kolay hale:

  • 2.x kullanıcıları için 2,7 veya 2,6 + gerektirir. Aksi takdirde, örneğin, parametrelerle yükseltilemez ve istisnalar yapamazsınız veya bunları değişkenlere ve diğer ciddi sınırlamalara yakalayamazsınız.
  • 3.x kullanıcılar için 3.3+ veya en az 3.2+ gerekir. Tutarsız uyumsuzlukların çoğu (u önekinin alınması gibi) 3.2 veya 3.3'te tersine çevrildi.
  • six kitaplığını kullanın.
  • __future__ ifadelerini kullanın. Daima
  • sen (her zaman 8 bit), unicode (stdlib API'leri çoğu bekliyoruz olursa olsun) (eğer 8-bit isterseniz kodlamak gerekir) veya str ve encode ve decode olarak bytes demek olmadığı konusunda kafanın içinde net olması gerekli.
  • Kodunuzda düzenli olarak 2to3 çalıştırın. (Ama körü körüne herşeyi yapmayın. Örneğin, d.keys() veya map(f, l) kullanıyorsunuz, çünkü list geri dönüp dönmemeniz umrumda değil, bir uyarı alacaksınız, çünkü 2to3 bilmiyor Eğer, bunun yerine hem çalışan kod yazmak için çalışmakla, Alternatif

). care 2.x üzerinde çalışan kod yazmak, ancak otomatik olarak 3.x kodu çalıştırması 2to3 tarafından dönüştürülebilir ve yok Yükleme işleminizin bu bölümünü yapın (setup.py, if sys.version_info >= (3, 0):'da 2to3 adımını yapın).

Düzenlemenizden, çoğunlukla # ile neyi koyacağınız ile ilgili olduğunuzu sanıyoruz! hat. Bunun için:

Sonra bu env ilk etapta çalışması garanti edilmez çalışmak ama garanti edilmez
/usr/bin/env python 

... Sen aslında güvenebilirsiniz: hemen üzerinde

  • Platform/dağıtıma malzemeleri tek 2.x, python hemen hemen tüm sistemde Python 2.
  • olan herhangi bir sistem, python hemen hemen tüm sistemin platformu üzerinde Python 2.
  • platformu/dağıtıma malzemeleri hem burada/gün sadece 3 tedarik eder.x (şu anda çok nadir olmakla birlikte, muhtemelen sonunda daha yaygın olacak olan), python Ancak

Python 3. geçerli:

  • bir sistemde nerede platformu malzemeleri ne, eğer yönetici Sadece yüklü 3.x, muhtemelen (2013 başından itibaren) değilpython olarak kullanılabilir. Bu konuda yapabileceğiniz fazla bir şey yok.

sonuncusu ciddi bir sorun ise, python çalışır sh yazılmış bir başlatıcısı senaryo, ekleyerek etrafında çalışabilir ve başarısız olursa o zaman python3 çalışır.

Bunu yapmanın en iyi yolu, başlatıcısı komut dosyasının kendisini Python komut dosyanızdaki shebang yorumlayıcısı olarak belirtmektir. Linux bunu halledebilir, ancak yapılandırılabilir ve en azından bazı dağıtımlar bunu varsayılan olarak devre dışı bırakır — ve çoğu diğer * nix sistemleri bunu yapamaz.

Bu işe yaramazsa, bir sonraki en iyi seçenek kullanıcı başlatıcısı komut yani, yerine ./check.py ait ./check.sh ve sağ Python yorumlayıcısı dışarı check.sh rakamlar yapacaklarını anlatmak çalıştırmak yapmaktır ve için $python ./check.py çalışır kullanıcı.

Gerçekten zorlanmak istiyorsanız, Python komut dosyasını kabuk betiği içinde heredoc olarak gömebilirsiniz, böylece yalnızca bir dosyayı dağıtmanız gerekir. ./check.sh çalıştırırlar ve doğru Python'u bulur ve heredoc üzerinde çalıştırır.

+0

thx, sadece bu şekilde yapmak istiyorum, ama bu benim soru değil, sadece python3 ile çalıştırmak düşünüyorum #!/Usr/bin/env python3 kullanabilirsiniz, bir hata – xielingyun

+0

@ xielingyun: En popüler platformlar sadece 2 yükleyin .x veya her ikisini de yükleyin. Ama ne var ne yok - ve, eğer yönetici sadece 3.x (özellikle dağıtım paketi yerine python.org'dan yüklüyse) yüklerse, muhtemelen python olarak kullanılamayacaktır. '. Bu senin için ciddi bir problem mi? Eğer öyleyse, tam olarak hangi platformda çalışıyorsunuz? – abarnert

+0

@ xielingyun: Ben bu dava için bazı genel yardımlarla cevabı düzenledim, ama dediğim gibi, tüm platformlarda çalışmayacak. – abarnert

0

olan komut Yorumcuyu bulmak check.py nasıl, sen komut dosyasının her iki sürümle uyumlu olmasını sağlamalıydı. Bu, 2to3 aracından bazı yardımlarla yapılabilir, ancak sonuçta iki farklı Python betiğini çalıştırmak anlamına gelebilir.

İlgili konular