Python'da dosya adının nasıl içe aktarılacağı bir sayı ile başlar


84

Temel olarak adında bir dosya var 8puzzle.pyve dosyayı başka bir dosyaya aktarmak istiyorum (aynı klasörde ve dosya sağlandığı için dosya adını değiştiremiyorum). Bunu Python'da yapmanın bir yolu var mı? Her zamanki yolu denedim from 8puzzle import *, bana bir hata veriyor.

Hata:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

12
İnsanlar neden "bana [bir] hata veriyor" diyor ve sonra hatanın ne olduğunu yayınlamıyor?
John Zwinck

7
@JohnZwinck Bu bir sözdizimi hatası. Tahmin ediyorum çünkü "8puzzle" geçerli bir tanımlayıcı değil (bir sayı ile başlıyor) ve import deyiminin sözdizimi orada bir Python tanımlayıcısı bekliyor. Bu da "Hayır, yapamazsınız. Modülü bir harf veya alt çizgiyle başlayan bir şeye yeniden adlandırın."
millimoose

John iyi noktayı yaptı, aklımda tutacağım. Ve teşekkürler Abhijeet hata mesajını benim için ekledi. Teşekkürler.
Simon Guo

1
Yeniden adlandırma 8puzzle.pyiçin puzzle8.pyve kullanımı import puzzle8.
Bakuriu

Yanıtlar:


96

Yapabilirsin

puzzle = __import__('8puzzle')

Çok ilginç bir problem. Hiçbir şeyi bir sayı ile adlandırmamayı hatırlayacağım.

Eğer isterseniz import *- bu soru ve yanıtı kontrol etmelisiniz .


1
harika çalışıyor! Teşekkürler. evet, bir sayıyla başlamazdım, ama bu bir kurs ödevi bildiri dosyası, bu yüzden adını değiştiremem. Ancak bunun için zaten bir çözüm bulduğumuz için önemli değil gibi görünüyor. Tekrar teşekkürler.
Simon Guo

4
Dünyayı veya en azından sınıf arkadaşlarınızı kurtarmaya yardım edin. İmkansız bir ithalatla karşılaşırsanız, eğitmenin dikkatini çekin. Evet, bazen yanlış olmaktan nefret ederler, ancak bu sorunu yaşıyorsanız, herkes de öyledir ve bu cevap işe yarasa da, doğru çözüm değildir (sınıf "Obfuscated Python 101" değilse).
msw

1
Daha iyi bir yol (en azından python 2.7 ile) 'importlib' modülünü kullanmaktır: puzzle = importlib.import_module ('8puzzle')
Cédric

3
Aslında bunun için iyi bir kullanım durumu var - derleme / üretim sürecinin bir parçası olarak, python modüllerini bir araya getirmek en kolayı sözlük biçiminde adlandırılırsa en kolay yoldur (genellikle önemli değildir, ancak üstte sabitler ve içe aktarmalar 'if name') 'altta, bu nedenle' 0 'ile başlayan birkaç modül yararlı olabilir.) Ayrıca, inotify veya watch ile birleştirildiğinde, böyle alışılmadık bir dizin düzeninde hata ayıklamada yararlıdır, örneğin: watch -n .1' cat * | python ', python uygulamanızı saniyenin onda bir (veya en azından olabildiğince hızlı) yükler veya: cat $ (. -name "* .py" bulun) | python
fatal_error

1
Partiye geç kaldı, ancak başka bir kullanım durumu Alembic geçişlerinden içe aktarılıyor, çünkü hepsi rastgele karmalarla başlıyor
kevlarr

35

Yukarıdaki cevaplar doğrudur, ancak şimdilik önerilen yol import_moduleişlevi kullanmaktır :

importlib.import_module(name, package=None)
Bir modülü içe aktarın. Adı argümanı belirtir mutlak veya göreceli anlamda ithalat ne modülü (örn ya pkg.modya ..mod). İsim göreceli terimlerle belirtilmişse, o zaman paket bağımsız değişkeni, paket adını çözümlemek için çapa görevi görecek olan paketin adına ayarlanmalıdır (örn . import_module('..mod', 'pkg.subpkg')İçe aktarılacaktır pkg.mod).

İmport_module () işlevi etrafta basitleştirici bir sarmalayıcı görevi görür importlib.__import__(). Bu, işlevin tüm anlamlarının türetildiği anlamına gelir importlib.__import__(). Bu iki işlev arasındaki en önemli fark import_module(), belirtilen paketi veya modülü (ör. pkg.mod) __import__()Döndürürken, üst düzey paketi veya modülü (ör. pkg) Döndürmesidir .

Yorumlayıcı yürütmeye başladığından beri yaratılan bir modülü dinamik olarak içe aktarıyorsanız (örneğin, bir Python kaynak dosyası yarattı), invalidate_caches()yeni modülün içe aktarma sistemi tarafından fark edilmesi için aramanız gerekebilir .

__import__ şimdi tavsiye edilmiyor.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
Yerleşik __import__()işlevin bir uygulaması .

Not Modüllerin programlı olarak içe aktarılmasında import_module()bu işlevin kullanılması gerekir .


Teşekkürler, ancak bu dosyalardan birinin içine bir sayı ile başlayan bir işlevi veya değişkeni içe aktarmak işe yaramaz. Yaparsam: an_imported_file = importlib.import_module('13_file')yapamam from an_imported_file import var_x. Bunu başarmak için yapılabilecek herhangi bir şey var mı?
Martin

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
Martin

Ayrıca, Pycharm'daki "an_imported_file import var_x" satırının altı kırmızıyla çizilmiştir ...
Martin

Üzgünüm bilmiyorum. Genel tavsiyem bunu yapmaktan kaçınmaktır.
laike9m

0

Kullanmayın .pysenin ithalattaki uzantısı.

Çalışıyor mu from 8puzzle import *?

Değeri ne from x import *olursa olsun, o modülün ad alanını mevcut bağlamınıza dahil ettiği için tercih edilen bir Python kalıbı değildir.

Genel olarak, özellikle o modülden istediğiniz şeyleri içe aktarmaya çalışın. Diğer modülden herhangi bir global içe aktarılabilir.

örneğin, eğer varsa 8puzzle.foo, 8puzzle ithalatından yapabilirsiniz.

Düzenle:

Mesajım .pydoğru olsa da yeterli değil.

Diğer göndericinin __import__('8puzzle')önerisi doğrudur. Ancak, bu modelden kaçınmanızı şiddetle tavsiye ederim .

Birincisi, dahili, özel bir Python yöntemi ayrılmıştır. Temel olarak, bir modülü içe aktarmanın ne anlama geldiğine dair temel varsayımları çiğniyorsunuz. Dosyayı basitçe başka bir adla yeniden adlandırmak puzzle8, bunu çözecektir.

Bu, içeriğinizin en üstte ne olduğunu bilmek ve kodun PEP8'e uymasını (denemek) bekleyen deneyimli Python programcılarını hayal kırıklığına uğratacaktır .


1
kafa karıştırıcı için özür dilerim. Yaptığım şeydi from 8puzzle import *ve orijinal sorumu düzenledim. Ve mvanveen'in dediği gibi çalışmıyor.
Simon Guo

Bu benim hatam. Modül dosya adlarının bir sayı ile başlayamayacağını unuttum. Bir düzenleme gönderdim.
mvanveen
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.