Python ไม่พบโมดูลในโฟลเดอร์เดียวกัน


98

python ของฉันไม่พบโมดูลใด ๆ ในไดเรกทอรีเดียวกัน ผมทำอะไรผิดหรือเปล่า? (python2.7)

ดังนั้นฉันจึงมีไดเรกทอรีหนึ่ง '2014_07_13_test' โดยมีสองไฟล์ในนั้น:

  1. test.py
  2. hello.py

โดยที่ 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
Salem

1
ลอง>>> import test
martineau

@Casy_fill คุณเรียกใช้โปรแกรมของคุณจากไดเร็กทอรีไฟล์อยู่ที่ไหน? สำหรับการนำเข้าไม่สำคัญว่าไฟล์ที่นำเข้าและและนำเข้าจะใช้ไดเรกทอรีร่วมกัน สิ่งสำคัญคือล่าม Python ของคุณมีไดเร็กทอรีปัจจุบันที่ตั้งไว้อย่างถูกต้อง
ม.ค. Vlcinsky

คำตอบ:


80

รหัสของคุณใช้ได้ฉันสงสัยว่าปัญหาของคุณคือวิธีที่คุณเปิดใช้งาน

คุณต้องเปิด python จากไดเร็กทอรี '2014_07_13_test' ของคุณ

เปิดพรอมต์คำสั่งและ 'cd' ในไดเร็กทอรี '2014_07_13_test' ของคุณ

ตัวอย่างเช่น:

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

หากคุณไม่สามารถ 'cd' ลงในไดเร็กทอรีเช่นนี้คุณสามารถเพิ่มลงในsys.path ได้

ใน test.py:

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

หรือตั้งค่า / แก้ไขPYTHONPATH

และทั้งหมดน่าจะดี ...

... มีข้อผิดพลาดเล็กน้อยกับบรรทัด 'shebang' ของคุณ (บรรทัดแรกในทั้งสองไฟล์ของคุณ) ไม่ควรมีช่องว่างระหว่าง '#' และ '!'

มีShebang ที่ดีกว่าที่คุณควรใช้

นอกจากนี้คุณไม่จำเป็นต้องใช้บรรทัด shebang ในทุกไฟล์ ... เฉพาะไฟล์ที่คุณต้องการเรียกใช้จากเชลล์ของคุณเป็นไฟล์ปฏิบัติการ


ขอบคุณมากที่มีปัญหา! น่าเสียดายที่ SublimeRepl (ที่ฉันใช้) ไม่รองรับการเริ่ม python จากโฟลเดอร์ในตอนนี้ดังนั้นดูเหมือนว่าฉันต้องส่งออก PATH เดี๋ยวนี้
Philipp_Kats

ผู้อ่านในภายหลังโปรดอ่านจนถึงด้านล่างของหน้าเพื่อดูคำตอบที่มีประโยชน์มาก ๆ เช่นจาก jfn ในการนำเข้าญาติ
HongboZhu

ใช่นี่คือปัญหาของฉัน ฉันมีโฟลเดอร์ขนาดใหญ่ของโครงการฝึก Python ที่เปิดใน VS Code และฉันมีปัญหาใหญ่ในการค้นหาสิ่งต่างๆในไดเรกทอรีเดียวกัน ปัญหาของฉันคือในเทอร์มินัลฉันไม่ได้เปลี่ยนไดเร็กทอรีไปยังไดเร็กทอรีย่อยที่ฉันมีโปรเจ็กต์ปัจจุบันของฉันเมื่อฉันทำเช่นนั้นปัญหาจะได้รับการแก้ไข
Matt West

105

เปลี่ยนการนำเข้าของคุณใน test.py เป็น:

from .hello import hello1

23
หากใครพบสิ่งนี้ในภายหลังจะเรียกว่าการนำเข้าแบบสัมพัทธ์และถูกเพิ่มใน python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit

9
ในการนำเข้าการใช้งานโมดูลทั้งหมดfrom . import hello
ST7

ฉันคิดว่านี่เป็นทางออกที่ดีกว่าคำตอบที่ได้รับการยอมรับดีที่สุด ฉันใช้การนำเข้าโมดูลทั้งหมดตามที่ ST7 ชี้ให้เห็น:from . import local_module
Gene M

25

ฉันมีปัญหาที่คล้ายกันฉันแก้ไขได้โดยการเพิ่มไดเร็กทอรีของไฟล์ลงในรายการพา ธ อย่างชัดเจน:

import os
import sys

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

หลังจากนั้นฉันก็ไม่มีปัญหาในการนำเข้าจากไดเรกทอรีเดียวกัน


2
ขณะนี้ได้ผลคำตอบจาก jwn โดยใช้การนำเข้าแบบสัมพัทธ์เป็นวิธีแก้ปัญหาที่สะอาดกว่ามาก
Russ Schultz

16

นี่คือวิธีแก้ปัญหาทั่วไปที่ฉันใช้ ช่วยแก้ปัญหาในการนำเข้าจากโมดูลในโฟลเดอร์เดียวกัน:

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

วางไว้ที่ด้านบนของโมดูลซึ่งทำให้เกิดข้อผิดพลาด "No module named xxxx"


1
สิ่งนี้ช่วยฉันโหลดโมดูลจากไดเร็กทอรีหลักโดยแทนที่ ".. " ด้วย "../ .. " ขอบคุณมาก!
Nikola R.

1
คือชื่อไฟล์ของไฟล์ที่จะนำเข้าหรือโมดูลปัจจุบันที่เรากำลังนำเข้าโมดูลหรือเป็นค่าคงที่
Manoj

9

ในกรณีของงูใหญ่ก็ไม่สามารถที่จะหามันเพราะฉันใส่รหัสภายในโมดูลยัติภังค์ my-modulee กรัม เมื่อฉันเปลี่ยนมันmy_moduleก็ใช้งานได้


1

ฉันพบปัญหานี้ ฉันมีสามโฟลเดอร์ในไดเร็กทอรีเดียวกันดังนั้นฉันจึงต้องระบุว่าโฟลเดอร์ใด เช่นจากสคริปต์การนำเข้าโฟลเดอร์


0

สิ่งต่อไปนี้ไม่สามารถแก้ปัญหาของ OP ได้ แต่ชื่อและข้อผิดพลาดคือสิ่งที่ฉันเผชิญ

หากโปรเจ็กต์ของคุณมีsetup.pyสคริปต์อยู่คุณสามารถติดตั้งแพ็กเกจนั้นโดยมีpython3 -m pip install -e .หรือpython3 setup.py installหรือpython3 setup.py developแพ็กเกจนี้จะได้รับการติดตั้ง แต่ยังสามารถแก้ไขได้ (ดังนั้นการเปลี่ยนแปลงโค้ดจะเห็นได้เมื่อนำเข้าแพ็กเกจ) ถ้ามันไม่ได้setup.py, ให้ความรู้สึกของมัน

อย่างไรก็ตามปัญหาที่ OP เผชิญดูเหมือนจะไม่มีอีกต่อไป?

ไฟล์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

โซลูชันอื่นดูเหมือน 'สกปรก'

ในกรณีของ OP ที่มีไฟล์ทดสอบ 2 ไฟล์การปรับเปลี่ยนให้ใช้งานได้ดี อย่างไรก็ตามในสถานการณ์จริงอื่น ๆ อาจไม่แนะนำวิธีการที่ระบุไว้ในคำตอบอื่น ๆ พวกเขาต้องการให้คุณแก้ไขโค้ด python หรือจำกัดความยืดหยุ่นของคุณ (เรียกใช้ไฟล์ python จากไดเร็กทอรีเฉพาะ) และโดยทั่วไปจะทำให้เกิดความรำคาญ จะเกิดอะไรขึ้นถ้าคุณเพิ่งโคลนโครงการและสิ่งนี้เกิดขึ้น อาจใช้ได้กับคนอื่นอยู่แล้วและไม่จำเป็นต้องทำการเปลี่ยนแปลงโค้ด คำตอบที่เลือกยังต้องการให้ผู้ใช้เรียกใช้สคริปต์จากโฟลเดอร์เฉพาะเพื่อให้ทำงานได้ นี่อาจเป็นที่มาของความรำคาญในระยะยาวซึ่งไม่ดีเลย นอกจากนี้ยังแนะนำให้เพิ่มโฟลเดอร์ python เฉพาะของคุณไปยัง PATH (สามารถทำได้ผ่าน python หรือ command line) อีกครั้งจะเกิดอะไรขึ้นหากคุณเปลี่ยนชื่อหรือย้ายโฟลเดอร์ในอีกไม่กี่เดือน คุณต้องค้นหาหน้านี้อีกครั้ง และในที่สุดก็ค้นพบว่าคุณต้องกำหนดเส้นทาง (และคุณทำสิ่งนี้เมื่อสองสามเดือนก่อน) และคุณต้องอัปเดตเส้นทาง (แน่ใจว่าคุณสามารถใช้ sys.path และตั้งค่าทางโปรแกรมได้ แต่อาจยังไม่สม่ำเสมอ ). แหล่งที่มาของความรำคาญมากมาย


0

หากคุณแน่ใจว่าโมดูลทั้งหมดไฟล์ที่คุณพยายามนำเข้าอยู่ในโฟลเดอร์เดียวกันและควรเลือกโดยตรงเพียงแค่ระบุชื่อไม่ใช่เส้นทางอ้างอิงจากนั้นตัวแก้ไขหรือเทอร์มินัลของคุณควรเปิดโฟลเดอร์หลักที่ทั้งหมด มีไฟล์ / โมดูลอยู่

ลองเรียกใช้จาก Terminal ก่อนอื่นให้แน่ใจว่าคุณไปที่ไดเร็กทอรีที่ถูกต้อง

ซีดี path to the root folder where all the modules are

หลาม script.py

หรือถ้าเรียกใช้ [F5] จากโปรแกรมแก้ไขเช่น VsCode ให้เปิดโฟลเดอร์ทั้งหมดที่นั่นไม่ใช่แต่ละไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.