从IPython解释器而不是命令行运行模块

10

我正在开发一个程序包,我的结构如下:

 mypackage/
    __init__.py
    __main__.py
    someotherstuff.py
    test/
        __init__.py
        testsomeotherstuff.py

我已经设置好了main.py函数运行一些单元测试,从命令行执行python mypackage可以正常工作。然而,我经常想使用ipython进行调试,但是在解释器中,run mypackage会出现错误ERROR: File 'mypackage.py' not found。我可以通过手动运行run mypackage/__main__.py来运行它,但这似乎是不正确的。我是否应该做其他事情来正确设置它?

5
最近的一个版本中添加了执行 %run -m mypackage 的功能 - 我不知道这对你的情况是否适用。 - Thomas K
1个回答

8
自Python 2.5起,可以将软件包作为程序运行。我认为IPython没有本地支持此功能的特性,但从版本2.7开始,Python标准库具备了这个功能,即runpy.run_module()函数。请注意,它的行为与IPython的%run略有不同,因为它会返回模块的全局字典而不是直接将其导入到解释器范围内。

这给了我一个错误:ImportError: mypackage是一个包,不能直接执行 - tdc
@tdc:你使用的是什么Python版本? - Sven Marnach
“Python 2.6.5” - 这就很奇怪了,因为它可以从命令行运行? - tdc
在Python 3.11中,我使用runpy.run_module("mypkg.my_module", run_name=__name__)来运行子模块中__main__部分的代码。然而,我无法成功传递参数(在sys.argv中)。 - undefined
1
@JuanPi 模块会自行查看 sys.argv 来获取命令行选项。因此,在调用 run_module() 之前,您需要修改 sys.argv 来传递参数。虽然这不是最美观的做法,因为您通过全局状态传递参数,但一般来说,唯一的替代方案就是派生一个新的解释器。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接