अजगर एक ही फ़ोल्डर में मॉड्यूल नहीं मिल सकता है


97

मेरे अजगर किसी तरह एक ही निर्देशिका में किसी भी मॉड्यूल नहीं मिल सकता है। मैं क्या गलत कर रहा हूं? (Python2.7)

इसलिए मेरे पास एक निर्देशिका '2014_07_13_test' है, जिसमें दो फाइलें हैं:

  1. test.py
  2. hello.py

हेल्लोअरोक्सम:

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

def hello1():
    print 'HelloWorld!'

और test.py:

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

from hello import hello1

hello1()

फिर भी अजगर मुझे देता है

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

क्या गलत है?


2
आप स्क्रिप्ट को कैसे निष्पादित कर रहे हैं? इसके अलावा आउटपुट क्या हैimport sys; sys.path
सेलम

1
कोशिश करें>>> import test
मार्टिन

@Casy_fill क्या आप निर्देशिका से अपना प्रोग्राम चलाते हैं, जहां फाइलें मौजूद हैं? आयात करने के लिए, इससे कोई फर्क नहीं पड़ता कि आयात और आयात की गई फ़ाइलें एक निर्देशिका साझा करती हैं। महत्वपूर्ण यह है, कि आपके पायथन इंटरप्रेटर में करंट डायरेक्टरी ठीक से सेट है।
जनवरी Vlcinsky

जवाबों:


79

आपका कोड ठीक है, मुझे आपकी समस्या पर संदेह है कि आप इसे कैसे लॉन्च कर रहे हैं।

आपको अपने '2014_07_13_test' निर्देशिका से अजगर लॉन्च करने की आवश्यकता है।

अपने '2014_07_13_test' निर्देशिका में एक कमांड प्रॉम्प्ट और 'सीडी' खोलें।

उदाहरण के लिए:

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

यदि आप इस तरह से निर्देशिका में 'सीडी' नहीं कर सकते हैं तो आप इसे sys.path में जोड़ सकते हैं

Test.py में:

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

या PYTHONPATH को सेट / एडिट करें

और सब ठीक होना चाहिए ...

... अच्छी तरह से आपकी 'शेबंग' लाइनों (आपकी दोनों फाइलों में पहली पंक्ति) में थोड़ी सी भी गलती है, '#' और '' के बीच जगह नहीं होनी चाहिए!

एक बेहतर शेबंग है जिसका आपको उपयोग करना चाहिए।

इसके अलावा, आपको हर फाइल पर शेलबैंग लाइन की आवश्यकता नहीं है ... केवल वही जो आप अपने शेल से निष्पादन योग्य फ़ाइलों के रूप में चलाना चाहते हैं।


बहुत बहुत धन्यवाद, कि मुद्दा! दुर्भाग्य से, SublimeRepl (जो मैं उपयोग करता हूं) अभी फ़ोल्डर से अजगर शुरू करने का समर्थन नहीं करता, इसलिए ऐसा लगता है कि मुझे अब PATH निर्यात करने की आवश्यकता है
Philipp_Kats

बाद में पाठकों ने अन्य बहुत उपयोगी उत्तर देखने के लिए पेज के नीचे तक पढ़े, उदाहरण के लिए रिश्तेदार आयात पर jfn से एक ।
हांगबोझू

हां, यह मेरी समस्या थी। मेरे पास वीएस कोड में पाइथन अभ्यास परियोजनाओं का एक बड़ा फ़ोल्डर खुला था और मुझे उसी निर्देशिका में चीजों को खोजने में बड़ी समस्या हो रही थी। मेरी समस्या यह थी कि, टर्मिनल में, मैंने निर्देशिकाओं को उप-निर्देशिका में नहीं बदला था, जिसमें मेरी वर्तमान परियोजना थी। एक बार मैंने ऐसा किया, तो समस्या हल हो गई।
मैट वेस्ट

105

अपने आयात को test.py में बदलें:

from .hello import hello1

23
यदि बाद में किसी और को यह पता चलता है, तो इसे सापेक्ष आयात कहा जाता है और इसे अजगर 2.5 में जोड़ा गया: docs.python.org/2.5/whatsnew/pep-328.html
sgfit 6

9
पूरे मॉड्यूल उपयोग को आयात करने के लिएfrom . import hello
ST7

मुझे लगता है कि यह सबसे अच्छा स्वीकृत उत्तर की तुलना में बेहतर समाधान है। मैं पूरे मॉड्यूल आयात का उपयोग करता हूं, जैसा कि एसटी 7 ने बताया:from . import local_module
जीन एम

25

मुझे एक समान समस्या थी, मैंने फ़ाइल सूची को पथ सूची में स्पष्ट रूप से जोड़कर इसे हल किया:

import os
import sys

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

उसके बाद, मुझे उसी निर्देशिका से आयात करने में कोई समस्या नहीं थी।


2
जबकि यह काम किया, रिश्तेदार आयात का उपयोग कर jwn से जवाब एक बहुत क्लीनर समाधान था।
रसेल

16

यहाँ जेनेरिक समाधान मैं उपयोग कर रहा हूँ। यह एक ही फ़ोल्डर में मॉड्यूल से आयात करने के लिए समस्या हल करता है:

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

इस मॉड्यूल के शीर्ष पर रखें जो त्रुटि देता है "xxxx नाम का कोई मॉड्यूल नहीं"


1
इससे मुझे ".." के साथ ".." को प्रतिस्थापित करके मूल निर्देशिका से मॉड्यूल लोड करने में मदद मिली। आपका बहुत बहुत धन्यवाद!
निकोला आर।

1
फ़ाइल का फ़ाइल नाम आयात किया जाना है या वर्तमान मॉड्यूल है जहाँ हम मॉड्यूल आयात कर रहे हैं या यह स्थिर है
मनोज

9

मेरे मामले में, पायथन इसे खोजने में असमर्थ था, क्योंकि मैं हाइफ़न के साथ एक मॉड्यूल के अंदर कोड डालूंगा, जैसे my-module। जब मैंने इसे बदल दिया तो my_moduleयह काम कर गया।


1

मैं इस मुद्दे में भाग गया। मेरे पास एक ही निर्देशिका में तीन फ़ोल्डर थे, इसलिए मुझे यह निर्दिष्ट करना था कि कौन सा फ़ोल्डर है। पूर्व: फ़ोल्डर आयात स्क्रिप्ट से


0

निम्नलिखित ओपी की समस्या को हल नहीं करता है, लेकिन शीर्षक और त्रुटि बिल्कुल वही है जो मैंने सामना किया था।

यदि आपकी परियोजना में एक setup.pyस्क्रिप्ट है, तो आप उस पैकेज को स्थापित कर सकते हैं, जिसमें आप python3 -m pip install -e .या python3 setup.py installउसके साथ हैं python3 setup.py develop, और यह पैकेज स्थापित किया जाएगा, लेकिन फिर भी संपादन योग्य है (इसलिए पैकेज को आयात करते समय कोड में परिवर्तन देखा जाएगा)। यदि यह एक नहीं है setup.py, तो इसका मतलब बनाओ

वैसे भी, ओपी चेहरे की समस्या अब मौजूद नहीं है?

फ़ाइल one.py:

def function():
    print("output")

फ़ाइल 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

अन्य समाधान 'गंदे' लगते हैं

2 परीक्षण फ़ाइलों के साथ ओपी के मामले में, उन्हें काम करने के लिए संशोधित करना शायद ठीक है। हालांकि, अन्य वास्तविक परिदृश्यों में, अन्य उत्तरों में सूचीबद्ध तरीकों की सिफारिश नहीं की जाती है। उन्हें आपको अजगर कोड को संशोधित करने या अपने लचीलेपन (विशिष्ट निर्देशिका से अजगर फ़ाइल को चलाने) को प्रतिबंधित करने और आम तौर पर झुंझलाहट की आवश्यकता होती है। क्या होगा यदि आपने अभी-अभी किसी प्रोजेक्ट का क्लोन बनाया है, और ऐसा होता है? यह शायद पहले से ही अन्य लोगों के लिए काम करता है, और कोड परिवर्तन करना अनावश्यक है। चुना हुआ उत्तर यह भी चाहता है कि लोग इसे बनाने के लिए एक विशिष्ट फ़ोल्डर से स्क्रिप्ट चलाएं। यह लंबे समय तक झुंझलाहट का स्रोत हो सकता है, जो कभी अच्छा नहीं होता है। यह आपके विशिष्ट अजगर फ़ोल्डर को PATH में जोड़ने का भी सुझाव देता है (अजगर या कमांड लाइन के माध्यम से किया जा सकता है)। फिर, क्या होता है यदि आप कुछ महीनों में फ़ोल्डर का नाम बदलते हैं या स्थानांतरित करते हैं? आपको इस पृष्ठ को फिर से लिखना होगा, और अंत में आपको पता चलता है कि आपको रास्ता निर्धारित करने की आवश्यकता है (और आपने कुछ महीने पहले ऐसा किया था), और यह कि आपको एक पथ को अपडेट करने की आवश्यकता है (सुनिश्चित करें कि आप sys.path का उपयोग कर सकते हैं और प्रोग्रामेटिक रूप से इसे सेट कर सकते हैं, लेकिन यह अभी भी परतदार हो सकता है )। बड़ी झुंझलाहट के कई स्रोत।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.