Python __init__;py没有将模块转换为包
我不确定这是否是一个愚蠢的问题,但我对包装和类似的东西没有经验。以下是包含文件的树结构:Python __init__;py没有将模块转换为包,python,packaging,Python,Packaging,我不确定这是否是一个愚蠢的问题,但我对包装和类似的东西没有经验。以下是包含文件的树结构: . ├── main.py └── stringfunc ├── __init__.py └── toLower.py main.py: 导入系统 导入stringfunc def main(): 打印(stringfunc.toLower.to_lower(sys.argv[1])) 返回0 如果名称=“\uuuuu main\uuuuuuuu”: main() toLower.py:
.
├── main.py
└── stringfunc
├── __init__.py
└── toLower.py
main.py:
导入系统
导入stringfunc
def main():
打印(stringfunc.toLower.to_lower(sys.argv[1]))
返回0
如果名称=“\uuuuu main\uuuuuuuu”:
main()
toLower.py:
def至_下部(仪表):
返回仪表下部()
并且\uuuu init\uuuuu.py
文件为空。
stringfunc
目录现在有一个\uuuu init\uuuuuu.py
文件时,不是应该像一个包一样工作吗?我知道我可以在\uuuu init\uuuuuuuuuuuuy.py
中使用from.toLower import to\u lower
来实现一种更简单、更不丑陋的方式,但我在一本书中看到,这段代码也必须工作,但它不能。所以我恐怕不明白它到底是怎么工作的
以下是错误:
AttributeError:模块“stringfunc”没有属性“toLower”
显然,Python仍然认为它是一个“模块”,而不是一个“包”。您已经完成了几乎所有需要做的事情。但是,导入不会自动获取所有路径并公开它们。您需要执行以下操作之一:
- 导入
stringfunc.toLower
- 将
添加到toLower
\uuuuuu init\uuuuuuuuuuu.py
toLower
”选项:
第一个正在工作!谢谢但是你能解释第二个吗?(将toLower添加到
\uuuu init\uuuuuuuuy.py
)您的意思是我在那里导入它?因为有一次我这样做了,它给出了一个错误:modulenofounderror:No module'toLower'
我假设您试图在\uuuu init\uuuuu.py
中进行绝对导入,但这不起作用,因为在init完成加载之前您不会有一个模块。你可以做相对导入。不,我没有做绝对导入。感谢您的编辑和您的时间。但是,即使我使用与您在编辑中输入的结构完全相同的结构,我仍然会得到相同的错误。1我在我的\uu init\uuuuuuuuupy
文件中添加import-toLower
,然后2我运行这个:python-c'import-stringfunc;打印(stringfunc.toLower.to_lower(“ABC”)”)”
。但是我得到了相同的错误:modulenofounderror:没有名为“toLower”的模块
。也许我犯了一个愚蠢的错误。另外,我没有完全理解您所说的部分:“在init完成加载之前,您不会有一个模块”。当然,我没有绝对导入。啊,对不起,这是py27对py3k的问题。你必须把py3kOh的绝对重要性。。。这就是问题所在。。。我猜Python会解释包内相对于导入发生的初始点(在本例中,在main.py中)的相对导入,对吗。。。?非常感谢。要使用stringfunc
作为一个包并使用不同的函数,您需要在init文件中加载函数,因此在init.py文件中加载import toLowe
@sahasrara62谢谢,但我想Cireo和我已经尝试过了,但它在Python3上不起作用。在Python3上,必须绝对导入toLower。只需在您的\uuu init\uuuu.py
文件中写入。导入toLower
,然后执行您正在执行的操作
foo/__init__.py
# py2k
> from foobar import foobarval
> import foobaz
# py3k
> from foo.foobar import foobarval
> import foo.foobaz as foobaz
foo/foobar.py
> foobarval = 1
foo/foobaz.py
> foobazval = 2
$ python -c 'import foo; print(foo.foobarval)'
1
$ python -c 'import foo; print(foo.foobaz.foobazval)'
2