Python 导入模块错误,“导入错误:无法导入名称 X”
我有两个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 个回答
你需要一个主脚本,把它放在和 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 ...
来导入第二个模块。
希望这些对你有帮助!
我最后做的事情是(因为在Python中,相对路径的问题似乎很常见):
我创建了一个叫做main.py的文件,它会执行一个
os.walk('.')
来发现所有的文件和文件夹,并把模块的名字存储在一个字典里,方便查看。
然后,我给main.py添加了一些功能,这样用户就可以通过main.py在命令行中简单地运行我的脚本,而不需要一个个去找每个模块并从那里运行。
这是我用来通过用户定义的字符串运行模块和函数的代码:
def runModuleFunction(moduleName, funcName, params):
m = __import__(moduleName)
func = getattr(m, funcName)
return func(params)
这个解决方案到目前为止运行得非常好。