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

标签 python python-3.x python-import

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





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/

相关文章:

移动数组元素的Python程序

python - print( )'s ` flush` 有什么作用?

python - 如何使语句 `import datetime` 绑定(bind) datetime 类型而不是 datetime 模块?

python - 无法使用 psutil.Process()

python - 计算df中 '1'的数量

python-3.x - Flask文件下载: filename persists within the session

python - Django 找不到 css(静态文件夹)

python - 脚本无法导入已安装的包,但解释器可以

Python 捕获 stdout/stderr 并在查看输出时记录到文件

Python Cerberus 如何检查动态根 key