gpt4 book ai didi

python - 如何直接运行Python包的主脚本?

转载 作者:行者123 更新时间:2023-12-01 07:12:00 24 4
gpt4 key购买 nike

我在放入包中的大量脚本上遇到了问题,并设置了一个测试存储库 package_test 以使事情正常运行,如下所示。我在 Windows 10 上使用 Python 3.7.4,并使用 VS Code 作为我的 IDE。

package_test/
-- package_test/
---- __init__.py
---- __main__.py
---- package_test.py
---- module_1.py
-- setup.py

我已经开始工作,这样我就可以使用此目录根目录中的 python -m package_test 将其作为模块运行。但是,如果我尝试直接运行 package_test.py 模块(例如让 VS Code 启动它,或使用调试器),则会收到错误。

问题似乎出在导入上。为什么我无法直接运行 package_test.py 脚本?

<小时/>

以下是相关文件:

__init__.py

from .module1 import *

__main__.py

import package_test.package_test

def main():
package_test.package_test.main()

if __name__ == '__main__':
main()

package_test.py

import package_test
from package_test.module1 import *

def main():
package_test.module1.main()

if __name__ == '__main__':
main()

module1.py

import package_test
from .module1 import *

def textfx():
print('Hello textfx!!')

def main():
package_test.module1.textfx()

if __name__ == '__main__':
main()
<小时/>

直接运行的错误是:

USER@PC MINGW64 /c/Code/python/package_test (master)
$ C:/apps/Python37/python.exe c:/Code/python/package_test/package_test/package_test.py
Traceback (most recent call last):
File "c:/Code/python/package_test/package_test/package_test.py", line 1, in <module>
import package_test
File "c:\Code\python\package_test\package_test\package_test.py", line 2, in <module>
from package_test.module1 import *
ModuleNotFoundError: No module named 'package_test.module1'; 'package_test' is not a package

但是,当我将其作为模块运行时,结果是:

USER@PC MINGW64 /c/Code/python/package_test (master)
$ py -m package_test
Hello textfx!!

最佳答案

sys.path的文档可以看出:

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. [...]

由于您正在运行 package_test$ python package_test/package_test.py,因此 Python 在示例中查找模块的第一个位置是 package_test/package_test。在这里,它找到您通过 import package_test 导入的模块 package_test.py。现在这个模块被缓存在sys.modules中。当您执行 from package_test.module1 import * 时,它会从模块缓存中获取 package_test 并报告这不是包,因此无法执行导入。

您应该将该 package_test.py 脚本重命名为其他名称。为什么它首先存在,因为它所做的只是从另一个模块导入,而 __main__ 只是从该脚本导入。为什么不能运行 __main__.py 并直接从 module1 导入它?

您可以将此代码放在 package_test.py 的顶部并检查输出:

import sys
print(sys.path)

import package_test
print(sys.modules)
print(package_test)

关于python - 如何直接运行Python包的主脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com