Python'a kendi modüllerimi içe aktaramıyorum


141

Modül içe aktarmanın Python'da nasıl çalıştığını anlamakta zorlanıyorum (daha önce başka bir dilde hiç yapmadım).

Diyelim ki:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

Şimdi böyle bir şey almaya çalışıyorum:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

Ancak, Python'un myappbir modül olduğunu göremediği için kesinlikle yanlış bir şey yapıyorum :

ImportError: No module named myapp

Yanıtlar:


96

Özel durumunuzda SomeObjectmyapp.py ve TestCase.py komut dosyalarından içe aktarmaya çalıştığınız anlaşılıyor. Myapp.py sitesinden

import SomeObject

çünkü aynı klasörde. TestCase.py için şunu yapın:

from ..myapp import SomeObject

Ancak , bu yalnızca TestCase'i paketten içe aktarıyorsanız çalışır. Doğrudan koşmak python TestCase.pyistiyorsanız, yolunuzu karıştırmanız gerekir. Bu Python içinde yapılabilir:

import sys
sys.path.append("..")
from myapp import SomeObject

ancak bu genellikle önerilmez.

Genel olarak, başkalarının Python paketinizi kullanmasını istiyorsanız , bir kurulum komut dosyası oluşturmak için distutils kullanmalısınız . Bu şekilde, herkes paketinizi benzer bir komut kullanarak kolayca yükleyebilir python setup.py installve makinesinin her yerinde kullanılabilir olacaktır. Paket konusunda ciddiyseniz, Python Paket Endeksine ( PyPI) bile ekleyebilirsiniz .


Sadece importbenim kullanarak kullanmayı denedim TestCase.pyama yine de bana aynı hatayı verdi. Bunun bir alt dizininde olduğu için __init__.pymi varsayıyorum ?
n0pe

Oh bekle sanırım anladım. Test senaryolarım paketten arıyorsa, from ... import ...doğru olanı kullanabilir miyim?
n0pe

1
Sadece TestCase paketin dışından içe aktarılıyorsa - örneğin, from myapp.tests import TestCase from a script outside myapp. If you're running testler klasöründe python TestCase.py` çalıştırırsam göreceli ithalat yapamazsınız
David Robinson

1
Myapp'ı yüklemek için "pip install -e." Komutunu çalıştırdım, ancak TestCase'i görsel stüdyo kodunda çalıştırmaya çalışırken hala "ImportError: myapp adında bir modül yok" iletisi alıyorum. ama ben "python" çalıştırın ve sonra myapp import SomeObject "python run" çalışır. Neyi yanlış yapıyorum?
dagrun

@DavidRobinson Yürüttükten sonra hiçbir hata göstermeyen, bahsettiğiniz yöntemi kullandım from fodername import file_name_of_my_py_code, ancak içinde tanımlanan nesneye erişmeye çalıştığımda file_name_of_my_py_code.pydiyorNameError: name 'ClassName' is not defined
Kavin Raju S

44

İşlev importPYTHONPATH env'nizdeki dosyaları arar. değişken ve yerel dizininiz. Böylece tüm dosyalarınızı aynı dizine koyabilir veya yazarak yolu bir terminale aktarabilirsiniz:

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

2
Öyleyse, onu kullanacak olan herkes için çalıştığından nasıl emin olabilirim? Onları çalıştırmadan önce belirli ortam değişkenlerini ayarlamalarını söylemek istemem.
n0pe

1
komut dosyası aynı klasörde / dizinde olduğu sürece geçerli dizin pythonpath içinde olmalıdır. ne yazık ki bu komut dosyalarının her biri ayrı dizinlerde.
JKirchartz

4
Windows kullanıcıları exportiçin "PYTHONPATH =% PYTHONPATH% ayarladık; C: \ path_to_myapp \ myapp \ myapp \"
loved.by.Jesus 14

Vs kodunda benim launch.json PYTHONPATH Env değişkeni ekleyerek bunu düzeltmek mümkün: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Michael Armitage

11

ihracat yolu iyi bir yoldur. Başka bir yol da site paketleri konumunuza bir .pth eklemektir. Mac bilgisayarımda pythonum site paketlerini aşağıda gösterilen / Library / Python'da tutar

/Library/Python/2.7/site-packages

/Library/Python/2.7/site-packages/awesome.pth adresinde awesome.pth adlı bir dosya oluşturdum ve dosyaya harika modüllerime başvuran aşağıdaki yolu koyuyorum

/opt/awesome/custom_python_modules

1
Ben pencerelerde çalışıyorum nasıl bunu nasıl
Nwawel A Iroume

Emin değilim. Windows kullanıyorsanız. Bazı vm yazılımları bulun ve linux kullanın. Veya - değişkenleri pencerelerde dışa aktarmayla ilgili bu cevaba bakınız. stackoverflow.com/questions/559816/…
jmontross

Bu tam olarak ihtiyacım olan şey
Lee88

1
@ Lee88 duymak mutlu - kendimi anlamaya biraz zaman aldı :)
jmontross

9

Deneyebilirsin

from myapp.myapp import SomeObject

çünkü proje adınız önce proje belgesinde arama yapan myapp.py ile aynı


3

İlk myapp dizininize bir setup.py dosyası ekleyebilir ve setup.py'ye iki python kodu ekleyebilirsiniz

from setuptools import setup
setup(name='myapp')

komut satırındaki ilk myapp dizininizde pip install -e komutunu kullanın. paketi kurmak


2

pip installWindows 10'da varsayılan olarak, yönetici ayrıcalıkları gerektiren bir dizin olan 'Program Files / PythonXX / Lib / site-Packages' klasörüne yüklenir. Bu yüzden pip install'i Yönetici olarak çalıştırarak sorunumu düzelttim (bir yönetici hesabıyla oturum açmış olsanız bile komut istemini yönetici olarak açmanız gerekir). Ayrıca, python'dan pip çağırmak daha güvenlidir.
örneğin
python -m pip install <package-name>
yerine
pip install <package-name>


0

Benim durumumda Windows vs Python sürpriz oldu, Windows dosya adları büyük / küçük harf duyarlı olmasa da, Python içe aktarma. Yani Stuff.pydosyanız varsa, bu adı olduğu gibi içe aktarmanız gerekir.


0

Sahip olmalısın

__init__.py

etkileşimde bulunmanız gereken kod içeren tüm klasörlerde. Ayrıca, içe aktarmaya çalıştığınız dosya aynı düzeyde olsa bile, her içe aktarmada projenizin en üst klasör adını belirtmeniz gerekir.

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.