2010-03-16 37 views
75

Tôi có kịch bản python này mà tôi cần phải chạy gdal_retile.pypython in cuối =''

nhưng tôi nhận được một ngoại lệ trên dòng này:

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

Các end='' là cú pháp hợp lệ. Tôi tò mò là tại sao, và những gì tác giả có thể muốn làm.

Tôi mới dùng python nếu bạn chưa đoán.


Tôi nghĩ rằng nguyên nhân gốc rễ của vấn đề là những hàng nhập khẩu đang thất bại và do đó người ta phải chứa nhập khẩu này 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

Nó thực sự giúp nếu bạn đăng traceback để chẩn đoán tốt nhất ngoại trừ bạn nhận được. Lỗi cú pháp rõ ràng là do thiếu dấu ngoặc kép mở. Nếu điều đó đã được sửa, nó vẫn sẽ là một lỗi cú pháp trong Python 2, mà không có chức năng in mà không có nhập khẩu '__future__'. –

+2

Ngoài ra, các biến không phải là 'ClassNames' sẽ bắt đầu bằng chữ thường. –

+0

wrt/@ Mike, xem http://www.python.org/dev/peps/pep-0008/ cho hướng dẫn đầy đủ cho cách đặt tên biến và kiểu mã hóa bằng Python. Bạn nên tuân thủ các nguyên tắc này vì trong Python bạn có đặc quyền làm việc với một thư viện chủ yếu nhất quán và do đó thường tránh được trò chơi đoán thông thường (ví dụ: PHP) ngay cả khi bạn đang làm việc với mã của người khác. –

Trả lời

108

Bạn có chắc chắn bạn đang sử dụng Python 3.x không? Cú pháp không có sẵn trong Python 2.x vì print vẫn là một câu lệnh.

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

bằng Python 2.x là giống hệt nhau để

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

hoặc

print "foo" % bar, end=" " 

ví dụ như một lời kêu gọi in với một tuple như là đối số.

Đó rõ ràng là cú pháp không hợp lệ (chữ không lấy đối số từ khóa). Trong Python 3.x print là một hàm thực tế, do đó, nó cũng có các đối số từ khóa.

Các thành ngữ đúng bằng Python 2.x dành cho end=" " là:

print "foo" % bar, 

(lưu ý dấu phẩy cuối cùng, điều này làm cho nó kết thúc phù hợp với một không gian chứ không phải là một linebreak)

Nếu bạn muốn kiểm soát nhiều hơn đầu ra, hãy xem xét sử dụng trực tiếp sys.stdout. Điều này sẽ không làm bất kỳ phép thuật đặc biệt nào với đầu ra.

Tất nhiên trong các phiên bản gần đây của phần Python 2.x (2.5 nên có nó, không chắc chắn về 2.4), bạn có thể sử dụng các mô-đun __future__ để kích hoạt nó trong tập tin kịch bản của bạn:

from __future__ import print_function 

Cùng đi với unicode_literals và một số điều tốt đẹp khác (ví dụ: with_statement). Điều này sẽ không hoạt động trong các phiên bản thực sự cũ (tức là được tạo ra trước khi tính năng được giới thiệu) của Python 2.x, mặc dù vậy.

+1

Tôi đã kiểm tra phiên bản mỏ bằng cách sử dụng 'dpkg -p python' và nó là phiên bản 2.xx.xx.Cảm ơn bạn rất nhiều, tôi đã áp dụng gợi ý để đặt nó ở dạng "print" foo "% bar,' và nó hoạt động hoàn toàn ổn. – Mehrad

+1

chỉ cần đặt **, ** vào cuối bản in là awsome .. –

+0

Hãy nhớ, có một sự khác biệt (tinh tế) giữa 'print foo, bar' và' print (foo, bar) 'trong Python 2. The trước đây là một câu lệnh 'print' với hai mục trong danh sách" đối số "của nó; sau đó là câu lệnh 'print' với một tuple đơn trong danh sách đối số của nó. – chepner

38

Làm thế nào về điều này:

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

này cho phép bạn sử dụng chức năng print kiểu Python 3.0 mà không cần phải chỉnh sửa thủ công tất cả các lần xuất hiện của print :)

1

Tôi nghĩ rằng tác giả có thể có nghĩa là:

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

Ông còn thiếu một báo ban đầu sau print(.

Lưu ý rằng tính Python 3.0, print là một chức năng như trái ngược với một tuyên bố, nếu bạn đang sử dụng phiên bản cũ của Python tương đương sẽ là:

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

Tham số end có nghĩa là dòng được ' ' ở cuối chứ không phải là ký tự dòng mới. Tương đương trong các phiên bản trước của Python là:

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

(cảm ơn Ignacio).

+1

Thêm một ',' vào cuối sẽ làm điều đó. –

2

Dường như bạn vừa bỏ lỡ một dấu ngoặc kép mở. Hãy thử:

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

Tôi nghĩ anh ấy đang sử dụng Python 3.0 và bạn đang sử dụng Python 2.6.

+1

Điểm tốt! 'print (" foo "% bar, end =" ")' kích hoạt một lỗi cú pháp trong Python 2.6 dưới 'end =" "' giống như dấu trích dẫn không :) – badp

5

Trước hết, bạn thiếu báo giá ở đầu nhưng đây có thể là lỗi sao chép/dán.

Trong Python 3.x, phần end=' ' sẽ đặt dấu cách sau chuỗi được hiển thị thay vì dòng mới. Để làm điều tương tự trong Python 2.x, bạn sẽ đặt dấu phẩy ở cuối:

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

Tôi xen vào để làm một cái gì đó như thế này trong python 2 cú pháp sẽ là gì? bạn có ý nghĩa gì khi thêm dấu phẩy? –

+1

@ Rémi Mã trong câu trả lời của tôi là bằng Python 2 ... Và tôi đang đề cập đến dấu phẩy ở cuối. – interjay

0

Thậm chí tôi đã nhận được lỗi tương tự ngày hôm nay. Và tôi đã trải nghiệm một điều thú vị. Nếu bạn đang sử dụng python 3.x và vẫn nhận được lỗi, nó có thể là một lý do:

Bạn có nhiều phiên bản python cài đặt trên cùng một ổ đĩa. Và khi bạn đang presing nút f5 cửa sổ trăn vỏ (của ver. < 3.x) pops lên

tôi đã nhận được cùng một lỗi ngày hôm nay, và nhận thấy điều đó. Tin tôi đi, khi tôi thực thi mã của tôi từ cửa sổ shell thích hợp (của 3.x ver.), Tôi nhận được kết quả khả quan

0

SỬ DỤNG :: python3 filename.py

tôi đã báo lỗi như vậy, điều này xảy ra bởi vì tôi có hai phiên bản của python được cài đặt trên ổ đĩa của tôi là python2.7 và python3. sau đây là mã của tôi:

#!usr/bin/python 

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

khi tôi chạy nó bằng lệnh python lines.py Tôi đã nhận lỗi sau

#!usr/bin/python 

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

khi tôi chạy nó bằng lệnh python3 lines.py tôi thực hiện thành công

+1

#/usr/bin/env python3 –

0

chúng ta cần để nhập tiêu đề trước khi sử dụng end='', vì nó không được bao gồm trong thời gian chạy bình thường của python.

from __future__ import print_function 

nó sẽ hoạt động hoàn hảo tại

0

Đây chỉ là một điều phiên bản. Kể từ Python 3.x bản in thực sự là một hàm, do đó, nó bây giờ có các đối số như bất kỳ hàm bình thường nào.

Các end=' ' chỉ là để nói rằng bạn muốn có một không gian sau khi kết thúc báo cáo kết quả thay vì một ký tự dòng mới. Trong Python 2.x bạn sẽ phải làm điều này bằng cách đặt dấu phẩy ở cuối câu lệnh in.

Ví dụ, khi trong một môi trường Python 3.x:

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

sẽ cung cấp cho các đầu ra sau đây:

0 
1 
2 
3 
4 

Trong trường hợp như:

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

Sẽ cung cấp như đầu ra :

0 1 2 3 4 
7

Trong python 2.7 đây là cách bạn làm điều đó

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 

Trong python 3.x

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

Người đàn ông, bạn chỉ giải quyết một vấn đề gây nhầm lẫn cho tôi vài ngày, tôi chỉ nhớ những tiếng còi và cảnh ngày cũ nhưng không phải là lyris, và bây giờ tôi cuối cùng đã tìm ra bài hát đó là gì! ! –

+0

@ Sphynx-HenryAY vui lòng giúp bạn ra ngoài anh em –

1

Đối với python 2.7 Tôi có cùng một vấn đề Chỉ cần sử dụng "từ __future__ nhập khẩu print_function "không có dấu ngoặc kép để giải quyết này issue.This Đảm bảo Python 2.6 và sau đó Python 2.x có thể sử dụng chức năng Python 3.x in.

1

Hãy thử này nếu bạn đang làm việc với python 2.7:

from __future__ import print_function 
+0

Chào mừng bạn đến với StackOverflow: nếu bạn đăng mã, XML hoặc mẫu dữ liệu, hãy đánh dấu những dòng đó trong trình chỉnh sửa văn bản và nhấp vào nút "mẫu mã" ({}) trên trình chỉnh sửa thanh công cụ hoặc sử dụng Ctrl + K trên bàn phím của bạn để định dạng độc đáo và cú pháp làm nổi bật nó! – WhatsThePoint