与普通脚本相比,在python包中导入
我已经编写了一个小python代码,它解析文件中的数据,然后使用Selenium将数据输入到网站中,我正在尝试将其与脚本捆绑在一起 我已经能够将它捆绑到一个pip包中并上传它,但是当尝试运行它时,我得到了同一目录中没有模块名为“” 我的结构很简单与普通脚本相比,在python包中导入,python,pip,Python,Pip,我已经编写了一个小python代码,它解析文件中的数据,然后使用Selenium将数据输入到网站中,我正在尝试将其与脚本捆绑在一起 我已经能够将它捆绑到一个pip包中并上传它,但是当尝试运行它时,我得到了同一目录中没有模块名为“” 我的结构很简单 chessil_tourney_inserter/ setup.py chessil_tourney_inserter/ __init__.py (empty) chessil_tourney_inser
chessil_tourney_inserter/
setup.py
chessil_tourney_inserter/
__init__.py (empty)
chessil_tourney_inserter.py
swiss98_text_parser.py
command_line.py
并且setup.py也是非常基本的:
from setuptools import setup
setup(name='chessil_tourney_inserter',
.
.
.
packages=['chessil_tourney_inserter'],
zip_safe=False,
install_requires = [
'selenium'
],
entry_points={
'console_scripts': [
'insertchessiltourney = chessil_tourney_inserter.command_line:main']
})
从现在起,command\u line.main
只需调用chessil\u tourney\u inserter
:
import chessil_tourney_inserter.chessil_tourney_inserter as cti
import sys
def main():
if len(sys.argv) == 1:
print("Usage: chessil_tourney_inserter.py *tournament name*")
exit()
cti.main();
if __name__ == "__main__":
main()
chessil_tourney_inserter告诉我一个导入错误:
import swiss98_text_parser
但是如果我尝试直接运行chessil\u tourney\u inserter.py
,并且如果我将包名添加到导入中,它将中断chessil\u tourney\u inserter.py
那么,我应该如何设置文件,以便在我自己直接运行文件时,以及在我尝试将其作为包导入或作为脚本运行时,导入都能正常工作呢?在顶部文件夹中添加
\uuu init\uuuuupy
chessil_tourney_inserter/
setup.py
__init__.py
chessil_tourney_inserter/
__init__.py (empty)
chessil_tourney_inserter.py
swiss98_text_parser.py
command_line.py
有关更多信息,请参阅。非常简单,工作非常完美。非常感谢。我读了init.py,但没有意识到它应该在目录之外。。。在我的搜索中,我发现从Python3开始,如果包名与目录匹配,即使没有init.py文件,它也会在其中搜索,这就是代码使用包名的原因吗?是的,我认为是这样。引入了这一变化。您使用的是哪一版本的Python?我目前使用的是3.4.2版
\uuuuu init\uuuuupy.py
不需要用于名称空间包<代码>命名空间包是那些只包含其他包的包。基本上,它们包含文件夹,但不包含文件。您有两个同名的包。您希望顶级文件夹chessil_tourney_inserter也成为一个包。由于它有一个文件setup.py
,它是一个常规的
包,因此需要一个\uuuu init\uuuu.py
也请参见TL;DR\uuuu init\uuuuu.py
对于命名空间
包不是必需的,但是对于常规
包是必需的