Python 导入模块错误,“导入错误:无法导入名称 X”

0 投票
2 回答
3650 浏览
提问于 2025-04-18 10:28

我有两个Python模块,一个叫做testingDirectories.py,另一个叫做testFile.py。

我的目录里有两个文件夹:simulations和src。

"simulations"文件夹是用来存放每个模拟运行的源代码的。

"src"文件夹则存放我用来运行这些模拟的主要项目的源代码。

我的testingDirectories.py文件在"simulations"文件夹里,而testFile.py在"src"文件夹里。

testFile.py的内容如下:

def testFunction(m):
    return 'hello, world'

testingDirectories.py的内容如下:

import sys
import os

from src.testFile import testFunction

testFunction('hello')

当我运行这个简单的演示时,它给了我一个错误:

from src.testFile import testFunction
ImportError: cannot import name testFunction

这个演示的目的是想看看程序能否找到"src"这个目录,而不需要告诉它去根目录找。它似乎能找到其他文件夹及其模块和函数,但就是找不到像这样的简单测试函数。你们觉得我为什么会遇到这个错误呢?

2 个回答

0

你需要一个主脚本,把它放在和 simulations 以及 src 同一个文件夹里。这样,你就可以从这个主脚本去执行其他所有的脚本。或者,你也可以把 src 加到 simulations 里,并添加一些 __init__ 文件。

另外,你也可以这样组织文件结构:

|mypackage
    |__init__.py
    |simulations
        |__init__.py
        |testingDirectories.py
    |src
        |__init__.py
        |testFile.py

这个 __init__.py 文件可以是空的。第二步,把它加入到 PYTHONPATH 中。

$ set PYTHONPATH=%PYTHONPATH%;C:\my_python\mypackage

然后,在 testingDirectories.py 文件里:

from mypackage.src.testFile import testFunction
testFunction('hello')

还有一种方法?用 -m 选项来执行程序。

$ cd C:\my_python\mypackage\simulations\
$ python -m simulations.testingDirectories

这样你就可以用 from src.testFile ... 来导入第二个模块。

希望这些对你有帮助!

0

我最后做的事情是(因为在Python中,相对路径的问题似乎很常见):

我创建了一个叫做main.py的文件,它会执行一个

os.walk('.')

来发现所有的文件和文件夹,并把模块的名字存储在一个字典里,方便查看。

然后,我给main.py添加了一些功能,这样用户就可以通过main.py在命令行中简单地运行我的脚本,而不需要一个个去找每个模块并从那里运行。

这是我用来通过用户定义的字符串运行模块和函数的代码:

def runModuleFunction(moduleName, funcName, params):
    m = __import__(moduleName)
    func = getattr(m, funcName)
    return func(params)

这个解决方案到目前为止运行得非常好。

撰写回答