Python 在同一文件夹中找不到模块
Posted
技术标签:
【中文标题】Python 在同一文件夹中找不到模块【英文标题】:Python can't find module in the same folder 【发布时间】:2014-09-03 12:34:49 【问题描述】:我的 python 在同一目录中找不到任何模块。 我究竟做错了什么? (python2.7)
所以我有一个目录'2014_07_13_test',里面有两个文件:
-
test.py
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()
仍然是 python 给了我
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 4, in <module>
ImportError: No module named hello
怎么了?
【问题讨论】:
你是如何执行脚本的?还有import sys; sys.path
的输出是什么@
试试>>> import test
@Casy_fill 您是否从目录运行程序,文件在哪里?对于导入,导入和导入的文件共享一个目录并不重要。重要的是,您的 Python 解释器已正确设置当前目录。
仔细检查您正在运行预期根目录中的文件。
【参考方案1】:
你的代码很好,我怀疑你的问题是你如何启动它。
您需要从“2014_07_13_test”目录启动 python。
打开命令提示符并“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”行(两个文件中的第一行)有一个小错误,“#”和“!”之间不应有空格
您应该使用better shebang。
此外,您不需要在每个文件上都使用 shebang 行...只需要您打算从 shell 作为可执行文件运行的那些。
【讨论】:
非常感谢,这个问题!不幸的是,SublimeRepl(我使用的)现在不支持从文件夹启动 python,所以我现在需要导出 PATH 以后的读者请阅读到页面底部以查看其他非常有用的答案,例如jfn 关于relative imports的那个。 是的,这是我的问题。我在 VS Code 中打开了一个包含 Python 练习项目的大文件夹,但在同一目录中查找内容时遇到了很大的问题。我的问题是,在终端中,我没有将目录更改为我当前项目所在的子目录。一旦我这样做了,问题就解决了。 请注意 sys.path.append() 仅添加当前 python 会话的位置,而不是永久添加。【参考方案2】:将 test.py 中的导入更改为:
from .hello import hello1
【讨论】:
如果其他人后来发现了这个,这称为相对导入,是在 python 2.5 中添加的:docs.python.org/2.5/whatsnew/pep-328.html 导入整个模块使用from . import hello
我认为这是一个比公认的最佳答案更好的解决方案。正如 ST7 指出的那样,我使用整个模块导入:from . import local_module
【参考方案3】:
我有一个类似的问题,我通过将文件的目录显式添加到路径列表来解决它:
import os
import sys
file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)
之后,我从同一个目录导入就没有问题了。
【讨论】:
虽然这行得通,但 jwn 使用相对导入的答案是一个更清洁的解决方案。【参考方案4】:这是我使用的通用解决方案。它解决了从同一文件夹中的模块导入的问题:
import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
把它放在给出错误“No module named xxxx”的模块顶部
【讨论】:
这帮助我从父目录加载模块,将“..”替换为“../..”。非常感谢! 是 file 要导入的文件的名称或我们正在导入模块的当前模块的名称,或者它是常量【参考方案5】:就我而言,Python 无法找到它,因为我将代码放在带有连字符的模块中,例如my-module
。当我将其更改为 my_module
时,它起作用了。
【讨论】:
【参考方案6】:我遇到了这个问题。我在同一个目录中有三个文件夹,所以我必须指定哪个文件夹。 例如:从文件夹导入脚本
【讨论】:
【参考方案7】:以下并没有解决OP的问题,但标题和错误正是我所面临的。
如果您的项目中有一个setup.py
脚本,您可以安装您所在的包,使用python3 -m pip install -e .
或python3 setup.py install
或python3 setup.py develop
,该包将被安装,但仍可编辑(因此更改导入包时会看到代码)。如果它没有setup.py
,make sense of it。
无论如何,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
其他解决方案看起来很“脏”
对于带有 2 个测试文件的 OP,修改它们以使其正常工作可能没问题。但是,在其他实际场景中,可能不推荐其他答案中列出的方法。它们要求您修改 python 代码或限制您的灵活性(从特定目录运行 python 文件)并且通常会引入烦恼。如果您刚刚克隆了一个项目,并且发生了这种情况怎么办?它可能已经对其他人有效,并且不需要更改代码。选择的答案还希望人们从特定文件夹运行脚本以使其工作。这可能是长期烦恼的根源,这绝不是好事。它还建议将您的特定 python 文件夹添加到 PATH(可以通过 python 或命令行完成)。同样,如果您在几个月内重命名或移动文件夹会发生什么?您必须再次搜索此页面,最终发现您需要设置路径(几个月前您确实这样做了),并且您只需要更新路径(确保您可以使用 sys.path 并以编程方式设置它,但这可能仍然不稳定)。许多令人烦恼的来源。
【讨论】:
【参考方案8】:如果您确定您尝试导入的所有模块、文件都在同一个文件夹中,并且应该直接通过提供名称而不是引用路径来选择它们,那么您的编辑器或终端应该已经打开了主目录所有文件/模块都存在的文件夹。
或者,尝试从终端运行,确保首先进入正确的目录。
cd path to the root folder where all the modules are
python script.py
或者,如果从编辑器(即 VsCode)运行 [F5],则在此处打开完整文件夹,而不是单个文件。
【讨论】:
【参考方案9】:我有一些类似的问题。即使它们都在同一个目录中,我也无法导入模块(importError)。我尝试了上面的解决方案,但没有一个对我有用。我必须自己(手动)设置路径。另外,代码是在我的大学服务器上运行的,也许这就是我必须手动设置路径的原因。
import sys
sys.path.append(r'path_to_directory_where_all_modules_are')
我推荐阅读The Module Search Path
【讨论】:
以上是关于Python 在同一文件夹中找不到模块的主要内容,如果未能解决你的问题,请参考以下文章