gpt4 book ai didi

python - 如何使 python 文件可作为脚本运行并作为包导入?

转载 作者:行者123 更新时间:2023-12-03 21:24:47 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why is Python running my module when I import it, and how do I stop it?

(11 个回答)


11 个月前关闭。




我仍在尝试掌握 python 3 并且遇到了一个问题,我可以将 .py 文件作为脚本运行或将其作为模块导入,但不能同时运行。

目录结构

test/
__init__.py
test.py
subwayclock/
__init__.py
subwayclock.py
build/
gen/
__init__.py
gtfs_realtime_pb2.py
nyct_subway_pb2.py
__init__.py

在这种情况下 test.py 看起来像这样并且可以工作(rawFEED() 是 metroclock.subwayclock 中的一个函数):
from subwayclock.subwayclock import *

print(rawFEED())

但是,我不能直接运行脚本,即
python subwayclock/subwayclock.py

因为它给出了以下错误:
Traceback (most recent call last):
File "subwayclock.py", line 32, in <module>
from .build.gen.gtfs_realtime_pb2 import FeedMessage
SystemError: Parent module '' not loaded, cannot perform relative import

但是,如果我将 metroclock/subwayclock.py 中的 import 语句修改为 state(即,删除了前导 '.'):
from subwayclock.subwayclock import FeedMessage

我可以直接通过命令行运行 metroclock.py 脚本,调用 主要 功能完美。

但是,当我运行原始 test.py 文件时,导入语句不再起作用,并且出现以下错误:
  Traceback (most recent call last):
File "test.py", line 1, in <module>
from subwayclock.subwayclock import *
File "/var/www/test/subwayclock/subwayclock.py", line 32, in <module>
from build.gen.gtfs_realtime_pb2 import FeedMessage
ImportError: No module named 'build'

我可以让这个脚本独立运行和导入吗?

最佳答案

在这种情况下,您可以只使用绝对导入而不是相对导入,但是根据模块之间的依赖关系,它可能会导致一些奇怪的行为,其中对象和类在技术上被定义了两次(一次在您的 __main__ 脚本中,当另一个模块导入您的模块时)

执行此操作的正确方法是使用 setup.py 创建一个正确的 python 包。脚本并使用 console_scripts 入口点功能将函数公开为命令行脚本。

你的项目应该像这样组织。

/subwayclock
/subwayclock
__init__.py
subwayclock.py
...
setup.py

你的 setup.py 看起来像这样
from setuptools import setup, find_packages

setup(name='subwayclock',
version='0.1',
packages=find_packages(),
zip_safe=False,
entry_points = {
'console_scripts': ['subwayclock_script_name=subwayclock.subwayclock:rawFEED'],
}
)

然后你只需安装包
$ python setup.py install

(您也可以使用 develop 模式,这样您仍然可以使用它)
$ python setup.py develop

您将能够运行该命令行脚本
$ subwayclock_script_name

关于python - 如何使 python 文件可作为脚本运行并作为包导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077539/

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