2015-03-29 18 views
5

Hem python hem de Pycharm için yeni. Bu nedenle, nerede yanlış yaptığımı ve sorunu nasıl çözebileceğimi belirtmekten çekinmeyin.Pycharm etkileşimli konsolu çalışmıyor

Sorun, IPython'un her zamanki gibi çalıştırmak istediğim işlevleri almadığıdır. Python dosyası çalıştıktan sonra bile, IPython konsolunda bu dosyadaki işlevleri alamıyorum. Ayrıca IPython konsolunda kod tamamlama yoktur. Örneğin, student adlı bir sınıf tanımladığım student.py adlı bir python dosyası yazarım. Sonra bu dosyayı çalıştırıyorum. Ancak IPython konsolu, konsolda student('Jack', 28) yazdığımda sınıfın öğrenci tanımlanmadığını söylüyor.

class student(object): 
    def _init_(self, name, age): 
     self.name=name 
     self.age=age 

Beni kafa karıştırıcı yapan şey, dosyayı çalıştırabilmem. Ben konsolda student('Jack', 28) yazdığınızda Ama ipython konsol

nedir
Traceback (most recent call last): 
File "/Library/Python/2.7/site-packages/IPython/core/interactiveshell.py", line 3032, in run_code 
exec(code_obj, self.user_global_ns, self.user_ns) 
File "<ipython-input-2-483e7a488507>", line 1, in <module> 
student('Jack',28) 
NameError: name 'student' is not defined 

daha IPython Magic Function da ipython konsolunda çalışmadığını söylüyor.

In[3]: %run student.py 
ERROR: File `u'student.py'` not found. 

Yeterli sayıda itibar olmadığı için durumları daha net hale getirmek için resim yok üzgünüm. nesneler/sınıfları/işlevleri/değişkenleri bile yürütme sonra Run> Edit Configuration> Interpreter Option çevirmen Seçeneği değiştirmek zorunda kalacak istinat İçin

+0

Yazdığınız komutların tam listesini konsolda yayınlayabilir misiniz? –

+0

Şüphesiz, sorun tanımımı güncelleştirdim – Jason

+0

"run -m student" denediniz mi? –

cevap

2

, orada -i eklemek zorunda. Hala konsolda kod tamamlama hakkında bilmiyorum.

+0

geçerli bir modulename olmadığını ortaya çıktı Teşekkürler, Çalıştır> Yapılandırmayı Düzenle> Yorumlayıcı Seçeneği açtım, ama nerede olduğunu bilmiyordum -i'yi eklemek için. Bunu daha açık bir şekilde açıklayabilir misiniz? – Jason

+0

“Tercüman Seçeneği” ni buldum ve '-i student.py' yazın. Ama işe yaramıyor. – Jason

+0

sadece '-i' yazın ve sonra 'uygula' yazın ve her zamanki gibi kodunuzu çalıştırın – Shivendra

1

Bu, python dosyasını nasıl çalıştırdığınıza bağlıdır. Bunu pycharm'ın içinden yapmanın pek çok yolu vardır (belki çok fazla).

Yaptığınız şeyin yeşil üçgene basmak olduğunu tahmin ediyorum. Bu, dosyayı alttaki "Python Console" sekmesinde bulunan aynı kabukta yürütmez. Bunun yerine yeni bir kabuk oluşturur, dosyayı yürütür ve dosya yürütüldüğünde varsayılan olarak kabuğu kapatır. Bu kabuğun alt kısmında 'Çalıştır' sekmesinde bir şey olduğunu görebilirsiniz. Shivendra'nın cevabından, senaryo çıkışında kabuğu öldürmekten kaçınmanın bir yolu olabileceğine benziyor. Bu durumda, 'Çalıştır' sekmesinde kalan bir terminal/kabuk ve 'Python Konsolu' sekmesindeki değil kullanıyor olmalısınız.

Bu, Çalıştır yerine Hata Ayıklama'yı kullanırsanız ne olacağına çok benzer. Bir tercüman oluşturur, hata ayıklayıcısını ekler, senaryoyu çalıştırır, bittiğinde her şeyi öldürür. Bu 'Hata Ayıklama' sekmesinde yaşar.

Aklınızda olanı gerçekleştirmenin en kolay yolu, dosyayı aşağıdaki gibi önceden varolan 'Python Console' içinde çalıştırmak olacaktır. Bu durumda, betik __main__ gibi çalışır, bu yüzden bir if __name__ == "__main__": varsa, True olarak değerlendirir ve if bloğu içindeki herhangi bir kod da yürütülür. (Bu konuda daha fazla geç, şu anda ne olduğunu yoksa) ipython veya başka (bir dosya sadece 'Python Shell' içinden içe olmaktır 'run' olarak

In[2]: dir() 
Out[2]: 
['In', 
'Out', 
'_', 
'__', 
'___', 
'__builtin__', 
'__builtins__', 
'__doc__', 
'__name__', 
'__package__', 
'_dh', 
'_i', 
'_i1', 
'_i2', 
'_ih', 
'_ii', 
'_iii', 
'_oh', 
'_sh', 
'exit', 
'get_ipython', 
'quit', 
'sys'] 
In[3]: run -m conventions.iec60063 
In[4]: dir() 
Out[4]: 
['Decimal', 
'E12', 
'E24', 
'E3', 
'E6', 
'In', 
'Out', 
'_', 
'_3', 
'__', 
'___', 
'__builtin__', 
'__builtins__', 
'__doc__', 
'__loader__', 
'__name__', 
'__nonzero__', 
'__package__', 
'_dh', 
'_i', 
'_i1', 
'_i2', 
'_i3', 
'_i4', 
'_ih', 
'_ii', 
'_iii', 
'_oh', 
'_sh', 
'cap_ostrs', 
'elem', 
'exit', 
'gen_vals', 
'get_ipython', 
'get_series', 
'idx', 
'ind_ostrs', 
'quit', 
'res_ostrs', 
'sys', 
'zen_ostrs'] 

Tercih ettiğim yolu) kendisi ve başlangıç ​​kodunun çalıştırılması gerekip gerekmediğini elle çalıştır. Bu, ad alanını aşırı derecede kirletmemek ve senaryoyu bir modül olarak kullanıyor olmanız halinde beklediğiniz şeylere çok yakın olan bir ortam sunma avantajına sahiptir (Pycharm ve IPython ve otomatik tamamlama, gerçekten işe yaramaya başlıyor).Her iki yöntemde de, hata ayıklayıcısını 'Python Console'un yorumlayıcısına' kabuğun yanındaki 'Hata Ayıklayıcı' simgesini kullanarak (yeşil hata) ekleme seçeneğiniz vardır.

Kısa örneği ('Python Konsolu' sekmesinde) aşağıdaki gibidir: Eğer neyin farkında olmalı, böylece

Özünde
In[2]: dir() 
Out[2]: 
['In', 
'Out', 
'_', 
'__', 
'___', 
'__builtin__', 
'__builtins__', 
'__doc__', 
'__name__', 
'__package__', 
'_dh', 
'_i', 
'_i1', 
'_i2', 
'_ih', 
'_ii', 
'_iii', 
'_oh', 
'_sh', 
'exit', 
'get_ipython', 
'quit', 
'sys'] 
In[3]: import conventions.iec60063 
In[4]: dir() 
Out[4]: 
['In', 
'Out', 
... (all the same ones as before) 
'conventions', 
... (all the same ones as before) 
] 

, sen olsa da, örneğin dosyayı çalıştıran olmaz Yapıyoruz. Bir piton dosyasını çalıştırdığınızda

, modül o __name__"__main__" olduğunu sanan ve bu (kesinlikle piton öğrenme sürecinde erken bakmak gereken bir şey olan) if __name__ == "__main__": hile kökenidir. Kodun yürütülmesini izlemeyi denerseniz, yorumlayıcı modülde sınıf veya işlev olmayan her şeyi çalıştırır. Bu, birçok python betiğinde görebileceğiniz if __name__ == "__main__": koşulunu içerir. if bloğunun içeriği, yalnızca betik kendiliğinden (veya IPython'da -m modülünü kullanarak) çalıştırılıyorsa çalıştırılır (

Diğer taraftan, bir modülü içe aktardığınızda, aynı yürütme sırası olur. if __name__ == "__main__":'un False olarak değerlendirileceği ve bu blokta yer alan kodların çağrılmayacağı. Bu nedenle, ihtiyacınız varsa, if __name__ == "__main__": bloğundaki el ile yürütmelisiniz. Bu görevi basitleştirmek için yaygın olan bir örnek, eğer blokta (veya komut satırı argümanlarını önemsiyorsanız, sadece oradakileri idare ederseniz) minimal fonksiyon çağrısına sahip olmaktır, daha sonra yürütmenin büyük bir kısmını kolayca çağrılabilir bir işleve aktarabilirsiniz. :

sonra modülünü içe sonunda ama yine bu kodu çalıştırmak için gereken durumda
def main(): 
    pass 

if __name__ == "__main__": 
    main() 

, yapmanız gereken tüm ana() işlevini çağırmak. yürütülmesi için (

In[2]: import conventions.iec60063 
In[3]: conventions.iec60063.main() 

pycharm kodu yürütme diğer bazı daha egzotik yolları vardır: gibi bir şey olur Yukarıdaki örnekte, ne yaparım (modül 'çalışan' ben bazı kod çalıştırmasına olsaydı) Gerçekten sadece ihtiyacım olmayan bir dosya ve böyle küçük bir parça), nasıl çalıştığını tam olarak bilmiyorum.

+0

Sorun şu ki, "run -m student" veya "import student" işlevi çalışmadı. IPython 'u 'tudent' run -m' yöntemi için sys.path 'geçerli bir modül değildir ve' import' yöntemi için öğrenci adında modül yok – Jason

+0

Ayarlar> Yap, Yürütme, Dağıtım> Konsol> Python Konsol. Başlangıç ​​betiğinde sys.path.extend ([WORKING_DIR_AND_PYTHON_PATHS] 'gibi bir şey olmalıdır.Ben PYTHONPATH seçilen içerik kökünü eklemek varsayılan (Ben hatırlıyorum - bunu değiştirmeyi unutmayın), ve öğrenci veya çalışma -m öğrenci ithal edebilmek için ya da size ne var, student.py kökünde mevcut olmalıdır Proje kökünde, klasör veya öğrenci (__init__.py'li klasör) adlı öğrenci bulunmalıdır. –

+0

Öğrenci bir alt klasördeyse, proje kökünden göreli yolla onu içe aktarmanız gerekir. Eğer dosya yapınız /somedirectory/student.py' ise, 'import somedirectory.student' veya 'run -m somedirectory.student' komutunu kullanmalısınız. Ben de 'somedirectory' bir paket olması gerekeceğini, yani '__init__py' dosyasının olması gerektiğini (boş olanın yapılacağını) bekliyorum –