python baskı sonu = ''


115

Çalıştırmam gereken yerde bu python betiğine sahibim gdal_retile.py

ama bu satırda bir istisna var:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

end=''Geçersiz sözdizimi. Nedenini ve yazarın muhtemelen ne yapmak istediğini merak ediyorum.

Henüz tahmin etmediyseniz python'da yeniyim.


Sanırım sorunun temel nedeni, bu ithalatların başarısız olması ve bu nedenle bu ithalatın kontrol altına alınması gerekiyor. from __future__ import print_function

try: 
   from osgeo import gdal
   from osgeo import ogr
   from osgeo import osr
   from osgeo.gdalconst import *
except:
   import gdal
   import ogr
   import osr
   from gdalconst import *

2
Aldığınız istisnayı en iyi şekilde teşhis etmek için geri bildirimi göndermeniz gerçekten yardımcı olur. Açık sözdizimi hatası, tekliflerin açılmamasından kaynaklanmaktadır. Bu düzeltildiyse, Python 2'de __future__içe aktarma olmadan yazdırma işlevine sahip olmayan bir sözdizimi hatası olur .
Mike Graham

2
Bir kenara bırakıldığında, olmayan değişkenler ClassNamesküçük harfle başlamalıdır.
Mike Graham

wrt / @Mike, Python'da değişken adlandırma ve kodlama stiline ilişkin eksiksiz yönergeler için python.org/dev/peps/pep-0008 adresine bakın . Yönergelere uymak iyi bir fikirdir çünkü Python'da çoğunlukla tutarlı bir kitaplıkla çalışma ayrıcalığına sahipsiniz ve bu nedenle, diğer insanların kodlarıyla çalışırken bile olağan tahmin oyunundan (ör. PHP) kaçabilirsiniz.
Alan Plum

5
Gelecekte hatalarla, özellikle de sözdizimi hatalarıyla ilgili yardım isterken , herhangi bir yeniden yazmadan çalıştırmayı denediğiniz kodu tam olarak sağlamaya çalışmalısınız .
Mike Graham

@Mike - Genelde bir daha yazmakla uğraşmazdım, ancak kod uzaktaki bir bilgisayardayken bunu yapamadım. Gelecekte daha dikkatli olacağımdan emin olacağım.
Hath

Yanıtlar:


155

Python 3.x kullandığınızdan emin misiniz? Sözdizimi Python 2.x'te mevcut değildir çünkü printhala bir ifadedir.

print("foo" % bar, end=" ")

Python 2.x ile aynıdır

print ("foo" % bar, end=" ")

veya

print "foo" % bar, end=" "

yani argüman olarak bir demet ile yazdırmak için bir çağrı olarak.

Bu açıkça kötü sözdizimidir (değişmezler anahtar kelime argümanları almaz). Python 3.x'te printgerçek bir işlev olduğu için anahtar kelime argümanlarını da alır.

Python 2.x için doğru deyim end=" "şudur:

print "foo" % bar,

(son virgülü not edin, bu satırın satır sonu yerine boşlukla bitmesini sağlar)

Çıktı üzerinde daha fazla kontrol istiyorsanız, sys.stdoutdoğrudan kullanmayı düşünün . Bu, çıktıyla özel bir sihir yapmaz.

Elbette Python 2.x'in biraz yeni sürümlerinde (2.5'te olmalı, 2.4 hakkında emin değil), __future__modülü komut dosyanızda etkinleştirmek için kullanabilirsiniz :

from __future__ import print_function

Aynı şey unicode_literalsve diğer bazı güzel şeyler için de geçerlidir ( with_statementörneğin). Bu, Python 2.x'in gerçekten eski sürümlerinde (yani özellik sunulmadan önce oluşturulmuş) çalışmaz.


1
Benim versiyonumu kontrol ettim dpkg -p pythonve 2.xx.xx versiyonuydu. Çok teşekkür ederim, şeklinde koymak için öneriyi uyguladım ve print "foo" %bar, mükemmel çalıştı.
Mehrad

Python 2 arasında print foo, barve print (foo, bar)arasında (ince) bir fark olduğunu unutmayın . İlki print, "bağımsız değişken" listesinde iki öğe bulunan bir ifadedir; ikincisi, printbağımsız değişken listesinde tek bir demet içeren bir ifadedir.
chepner

Örneğiniz tanımlanmadığı için print("foo" % bar, end=" ")işe yaramayacak bar; peki barsenin örneğinde ne var ? (En azından Python 3.7 ile benim için)
Qaswed

50

Buna ne dersin:

#Only for use in Python 2.6.0a2 and later
from __future__ import print_function

Bu, Python 3.0 stil printişlevini print:) ile ilgili tüm tekrarları elle düzenlemek zorunda kalmadan kullanmanıza olanak tanır


17

Python 2.7'de bunu nasıl yaparsınız

mantra = 'Always look on the bright side of life'
for c in mantra: print c,

#output
A l w a y s   l o o k   o n   t h e   b r i g h t   s i d e   o f   l i f e

Python 3.x'te

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 

5
Dostum, birkaç gündür kafamı karıştıran bir sorunu çözdün, sadece o ıslık ve eski gün sahnesini hatırlıyorum ama lirileri hatırlamıyorum ve şimdi sonunda bu şarkının ne olduğunu çözüyorum !!
Sphynx-Henry

@ Sphynx-HenryAY sana yardım etmekten mutluluk duyar kardeşim
Ritesh Karwa

İkinci örneğinizde, h a c k e r karakterler arasında boşluklar olduğu görülüyor . Python 3.7.3 kullanıyorum ve hiç boşluk almıyorum end=''.
Nagev

@Nagev sadece '' of end = '' arasına bir boşluk koyun
Ritesh Karwa

Teşekkürler, ben do not o ben kodunuzu gördüğünü düşündüm sadece, uzay istiyorum olmadan uzayda henüz çıkış hepsi bu, tutarsız görünüyordu ki, aralıklı edildi.
Nagev

5

Her şeyden önce, başlangıçta bir alıntı eksiktir, ancak bu muhtemelen bir kopyala / yapıştır hatasıdır.

Python 3.x'te, end=' 'bölüm bir satırsonu yerine görüntülenen dizeden sonra bir boşluk yerleştirecektir. Aynı şeyi Python 2.x'te yapmak için, sonuna bir virgül koyarsınız:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),

Python 2'de böyle bir şey yapmakla uğraşıyorum sözdizimi ne olurdu? virgül eklemek ne demek?
Rémi

1
@ Rémi Cevabımdaki kod Python 2'de ... Ve sondaki virgülden bahsediyorum.
interjay

4

Sanırım Python 3.0 kullanıyor ve siz de Python 2.6 kullanıyorsunuz.


1
İyi bir nokta! print("foo" % bar, end = " ")Python 2.6'da end = " "eksik alıntıda olduğu gibi bir sözdizimi hatasını tetikler :)
badp

3

Bu sadece bir versiyon şey. Python 3.x yazdırma aslında bir işlev olduğundan, artık herhangi bir normal işlev gibi bağımsız değişkenler alıyor.

Bu end=' ', ifadenin sonundan sonra yeni bir satır karakteri yerine bir boşluk istediğinizi söylemektir. Python 2.x'te bunu print deyiminin sonuna virgül koyarak yapmanız gerekir.

Örneğin, bir Python 3.x ortamında:

while i<5:
    print(i)
    i=i+1

Aşağıdaki çıktıyı verecektir:

0
1
2
3
4

Buna karşılık:

while i<5:
    print(i, end = ' ')
    i=i+1

Çıktı olarak verilecek:

0 1 2 3 4

Argümanın print()varsayılan değerini görebildiğinden , resmi belgelerine bir bağlantı yararlı olabilir : docs.python.org/3/library/functions.html#print'\n'end
Qaswed

Sonunda yukarıdaki örnekte olduğu gibi bir boşluk
bırakmayı

2

Görünüşe göre bir açılış çift tırnak eksik. Deneyin:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

1

Yazarın muhtemelen şunu kastettiğini düşünüyorum:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

Sonrasında ilk alıntı eksik print(.

Not itibariyle bu Python 3.0 , printPython eski sürümlerini kullanıyorsanız açıklamada aksine bir fonksiyondur, eşdeğer olacaktır:

print "Building internam Index for %d tile(s) ..." % len(inputTiles)

endParametre aracı hattı alır ' 'uç yerine satır karakteri de. Python'un önceki sürümlerindeki eşdeğeri şudur:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),

(teşekkürler Ignacio).


1
,Sonuna bir a eklemek işinizi görecektir.
Ignacio Vazquez-Abrams

1

KULLANIM :: python3 filename.py

Böyle bir hatayla karşılaştım, çünkü sürücümde python2.7 ve python3 olmak üzere iki python sürümü yüklü. Kodum şuydu:

#!usr/bin/python

f = open('lines.txt')
for line in f.readlines():
        print(line,end ='')

komutla çalıştırdığımda python lines.pyaşağıdaki hatayı aldım

#!usr/bin/python

f = open('lines.txt')
for line in f.readlines():
        print(line,end ='')

python3 lines.pyBaşarıyla yürüttüğüm komutla çalıştırdığımda


3
#! / usr / bin / env python3
Mingliang Liu

1

Python 2.7 için de aynı sorunu yaşadım Bu sorunu çözmek için tırnak işareti olmadan " __future__ içe aktarım yazdırma_işlevi " kullanın. Bu, Python 2.6 ve sonraki sürüm Python 2.x'in Python 3.x yazdırma işlevini kullanabilmesini sağlar.


1

Python 2.7 ile çalışıyorsanız bunu deneyin:

from __future__ import print_function

StackOverflow'a hoş geldiniz: Kod, XML veya veri örnekleri gönderirseniz, lütfen metin düzenleyicide bu satırları vurgulayın ve düzenleyici araç çubuğundaki "kod örnekleri" düğmesini ({}) veya klavyenizdeki Ctrl + K tuşlarını kullanarak güzel bir şekilde biçimlendirin ve sözdizimi vurgulayın!
WhatsThePoint

0

Ben bile bugün aynı hatayı alıyordum. Ve ilginç bir şey yaşadım. Python 3.x kullanıyorsanız ve hala hatayı alıyorsanız, bunun bir nedeni olabilir:

Aynı sürücüde kurulu birden fazla python sürümünüz var. Ve f5 düğmesini basılı tuttuğunuzda, python kabuğu penceresi (sürüm <3.x'in) açılır

Bugün aynı hatayı alıyordum ve o şeyi fark ettim. İnanın bana, kodumu uygun kabuk penceresinden (sürüm 3.x) çalıştırdığımda tatmin edici sonuçlar aldım


0

end=''python'un normal çalışma zamanına dahil olmadığı için kullanmadan önce bir başlığı içe aktarmamız gerekir .

from __future__ import print_function

şimdi mükemmel çalışacak


0

Hem Python 2 hem de 3 ile uyumlu :

sys.stdout.write('mytext')

Yalnızca Python 2 ile uyumludur

print 'mytext',

Yalnızca Python 3 ile uyumludur

print('mytext', end='')
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.