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

Wil*_*dia 5 python python-import python-3.x

我仍在尝试掌握 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
Run Code Online (Sandbox Code Playgroud)

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

from subwayclock.subwayclock import *

print(rawFEED())
Run Code Online (Sandbox Code Playgroud)

但是,我无法直接运行脚本,即

python subwayclock/subwayclock.py
Run Code Online (Sandbox Code Playgroud)

因为它给出了以下错误:

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
Run Code Online (Sandbox Code Playgroud)

但是,如果我修改 Subwayclock/subwayclock.py 中的导入语句以声明(即删除前导“.”):

from subwayclock.subwayclock import FeedMessage
Run Code Online (Sandbox Code Playgroud)

我可以直接通过命令行运行substituteclock.py脚本,完美调用main函数。

但是,当我运行原始 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'
Run Code Online (Sandbox Code Playgroud)

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

Max*_*Noe 0

-m您可以使用开关和完全限定的包路径从包运行脚本

python -m subwayclock.subwayclock
Run Code Online (Sandbox Code Playgroud)