Python aynı klasörde modül bulamıyor


98

Python'um bir şekilde aynı dizinde herhangi bir modül bulamıyor. Neyi yanlış yapıyorum? (python2.7)

Bu yüzden içinde iki dosya bulunan bir '2014_07_13_test' dizinim var:

  1. test.py
  2. merhaba.py

merhaba.py nerede:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

ve test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Hala piton bana veriyor

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

Sorun nedir?


2
Senaryoyu nasıl çalıştırıyorsun? Ayrıca ne çıktıimport sys; sys.path
Salem

1
Try>>> import test
martineau

@Casy_fill Programınızı dizinden çalıştırıyor musunuz, dosyalar nerede? İçe aktarma için, içe aktarılan ve içe aktarılan dosyaların bir dizini paylaşması önemli değildir. Önemli olan, Python yorumlayıcınızın geçerli dizini düzgün bir şekilde ayarlamış olmasıdır.
Jan Vlcinsky

Yanıtlar:


82

Kodunuz iyi, sorununuzun onu nasıl çalıştırdığınızdan şüpheleniyorum.

Python'u '2014_07_13_test' dizininizden başlatmanız gerekir.

Bir komut istemi açın ve '2014_07_13_test' dizininize 'cd' yazın.

Örneğin:

$ cd /path/to/2014_07_13_test
$ python test.py

Dizine bu şekilde 'cd' yapamıyorsanız, onu sys.path'e ekleyebilirsiniz.

Test.py'de:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Veya PYTHONPATH'ı ayarlayın / düzenleyin

Ve her şey yolunda olmalı ...

... eh, 'shebang' satırlarınızda küçük bir hata var (her iki dosyanızdaki ilk satır), '#' ve '!' arasında boşluk olmamalıdır.

Kullanman gereken daha iyi bir iş var .

Ayrıca her dosyada shebang satırına ihtiyacınız yoktur ... sadece kabuğunuzdan çalıştırılabilir dosyalar olarak çalıştırmayı planladığınız satırlar.


çok teşekkürler, sorun bu! Ne yazık ki, SublimeRepl (kullandığım) şu anda klasörden python başlatmayı desteklemiyor, bu yüzden PATH'i şimdi dışa aktarmam gerekiyor gibi görünüyor
Philipp_Kats

Daha sonra okuyucular, diğer çok yararlı cevapları görmek için lütfen sayfanın altına kadar okuyun, örneğin, jfn'den göreli ithalata ilişkin cevap .
HongboZhu

Evet, bu benim sorunumdu. VS Code'da açık büyük bir Python uygulama projeleri klasörüm vardı ve aynı dizinde bir şeyler bulmakta büyük sorunlar yaşıyordum. Benim problemim şu ki, terminalde, dizinleri mevcut projemin bulunduğu alt dizine değiştirmemiştim. Bunu yaptıktan sonra problem çözüldü.
Matt West

105

Test.py'deki içe aktarmanızı şu şekilde değiştirin:

from .hello import hello1

23
Bunu daha sonra başka biri bulursa, buna göreceli içe aktarmalar
sgfit

9
Tüm modülü içe aktarmak için kullanınfrom . import hello
ST7

Bunun kabul edilen en iyi cevaptan daha iyi bir çözüm olduğunu düşünüyorum. : ST7 belirttiği gibi ben, bütün modül ithalat kullanmakfrom . import local_module
Gen M

25

Benzer bir sorun yaşadım, dosyanın dizinini açıkça yol listesine ekleyerek çözdüm:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Bundan sonra, aynı dizinden içe aktarmada sorun yaşamadım.


2
Bu işe yarasa da, göreli ithalatı kullanan jwn'dan gelen yanıt çok daha temiz bir çözümdü.
Russ Schultz

16

İşte kullandığım genel çözüm. Aynı klasördeki modüllerden içe aktarma sorununu çözer:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Bunu, "xxxx adında modül yok" hatasını veren modülün üstüne koyun.


1
Bu, modülü ".." ile "../ .." ile değiştirerek üst dizinden yüklememe yardımcı oldu. Çok teşekkürler!
Nikola R.

1
olan dosya biz modülü ithal ediyoruz ithal edilecek dosyanın veya geçerli modülün adı ya da sabittir
Manoj

9

Benim durumumda, Python onu bulamadı çünkü kodu tire içeren bir modülün içine koyardım, örn my-module. Onu değiştirdiğimde my_moduleişe yaradı.


1

Bu sorunla karşılaştım. Aynı dizinde üç klasörüm vardı, bu yüzden hangi klasörü belirtmem gerekiyordu. Ör: Klasörden içe aktarma komut dosyası


0

Aşağıdakiler OP'nin problemini çözmez, ancak başlık ve hata tam olarak karşılaştığım şeydir.

Projeniz bir varsa setup.pyo senaryoyu, sen olduklarını paketi yüklendikten ile olabilir python3 -m pip install -e .veya python3 setup.py installveya python3 setup.py developve bu paket kurulacak, ancak (paket aktarırken koduna değişiklikler görülecektir böylece) hala düzenlenebilir. Bir yoksa setup.py, bir anlam .

Her neyse, OP'nin karşılaştığı problem artık yok gibi görünüyor?

dosya one.py:

def function():
    print("output")

dosya two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

Diğer çözümler 'kirli' görünüyor

2 test dosyası içeren OP durumunda, bunları çalışmak üzere değiştirmek muhtemelen iyidir. Ancak, diğer gerçek senaryolarda, diğer cevaplarda listelenen yöntemler muhtemelen tavsiye edilmemektedir. Python kodunu değiştirmenizi veya esnekliğinizi kısıtlamanızı (python dosyasını belirli bir dizinden çalıştırmanızı) gerektirir ve genellikle rahatsızlık verir. Ya bir projeyi klonladıysanız ve bu gerçekleşirse? Muhtemelen diğer insanlar için zaten işe yarıyor ve kod değişikliği yapmak gereksiz. Seçilen cevap aynı zamanda kişilerin çalışması için belirli bir klasörden bir komut dosyası çalıştırmasını ister. Bu, asla iyi olmayan uzun vadeli bir rahatsızlık kaynağı olabilir. Ayrıca, belirli python klasörünüzü PATH'e eklemenizi önerir (python veya komut satırı aracılığıyla yapılabilir). Yine, klasörü birkaç ay içinde yeniden adlandırır veya taşırsanız ne olur? Bu sayfayı tekrar araştırmanız gerekiyor, ve sonunda yolu belirlemeniz gerektiğini (ve bunu tam olarak birkaç ay önce yaptığınızı) ve bir yolu güncellemeniz gerektiğini (emin olun sys.path kullanıp programlı olarak ayarlayabileceksiniz, ancak bu yine de belirsiz olabilir ). Pek çok büyük sıkıntı kaynağı.


0

İçe aktarmaya çalıştığınız tüm modüllerin, dosyaların aynı klasörde olduğundan eminseniz ve doğrudan referans yolu değil, sadece isim verilerek seçilmeleri gerekiyorsa, editörünüz veya terminaliniz ana klasörü açmış olmalıdır. dosyalar / modüller mevcuttur.

Ya Terminal'den çalıştırmayı deneyin, önce doğru dizine gittiğinizden emin olun.

CD path to the root folder where all the modules are

piton script.py

Veya düzenleyiciden [F5] çalıştırılıyorsa, yani VsCode sonra tek tek dosyaları değil, tüm klasörü orada açın.

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.