我在导入包时遇到问题。
我的文件结构是这样的:
filelib/
__init__.py
converters/
__init__.py
cmp2locus.py
modelmaker/
__init__.py
command_file.py
模块内command_file.py
我有一个名为CommandFile
我想打电话给cmp2locus.py
module.
我已经尝试过以下操作cmp2locus.py
module:
import filelib.modelmaker.command_file
import modelmaker.command_file
from filelib.modelmaker.command_file import CommandFile
所有这些选项都会返回ImportError: No modules named ...
感谢任何有关解决此问题的提示。我不明白为什么这个导入不起作用。
要执行这些导入,您有 3 个选项,我将按照我喜欢的顺序列出它们。 (对于所有这些选项,我将假设 python 3)
相对进口
您的文件结构看起来像一个正确的包文件结构,因此这应该可以工作,但是尝试此选项的其他人应该注意,它要求您位于包中;这对于某些随机脚本不起作用。
您还需要运行从包外部进行导入的脚本,例如导入并从那里运行它,而不是直接运行 cmp2locus.py 脚本
然后您需要使用以下命令将导入更改为相对的..
So:
import filelib.modelmaker.command_file
becomes
from ..modelmaker import command_file
The ..
指父文件夹(如文件系统中的隐藏文件)。
另请注意,您必须使用from import
语法因为名称开头为..
不是 python 中的有效标识符。但是,您当然可以将其导入为您想要使用的任何内容from import as
.
也可以看看the PEP
绝对进口
如果您将包裹放入站点包(由返回的目录site.getsitepackages()
)您将能够使用您在问题中尝试使用的导入格式。请注意,这需要您的软件包的任何用户也将其安装在那里,因此这并不理想(尽管他们可能会这样做,但依赖它是不好的)。
修改python路径
As Meera回答你也可以直接使用 sys.path 修改 python 路径。
我个人不喜欢这个选项,因为它感觉非常“hacky”,但我被告知它很有用,因为它可以让您精确控制可以导入的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)