【问题标题】:Turn python script into a function将python脚本变成函数
【发布时间】:2016-09-16 12:59:21
【问题描述】:

假设我编写了一个脚本 morning.py,它执行了一个简单的打印语句

# morning.py
print 'Good morning'

几个小时后,我意识到我必须在另一个名为 evening.py 的脚本中使用这个脚本。我知道两种选择。首先,调用morning.py作为子进程

# evening.py
import subprocess
import shlex
process = subprocess.Popen(shlex.split('python morning.py'))
process.communicate()

这是我最初选择的方式。问题是我想将我的程序 (morning + evening) 打包成一个可执行文件。据我了解,从 exe 文件中这样的调用是行不通的。

另一种选择是将模块morning 转换为函数。比如这样的

# morning.py
def morning_func():
   print 'Good morning'

然后我可以简单地从evening 模块调用这个函数

# evening
import morning
morning.morning_func()

这里的问题是,与morning 不同,我的实际初始脚本非常扩展且混乱。我没有可以执行的单个函数来模拟脚本运行流程。将整个脚本包装在一个函数中感觉不对。

有哪些可能的解决方案?

【问题讨论】:

  • 绝对没有充分的理由通过 Popen 从另一个运行 Python 脚本。为什么不能按原样导入?
  • 重构 morning 使其具有主要功能。
  • @DanielRoseman 假设在evening 脚本中我添加了一行import morning。如何从evening 内部获得'Good morning' 问候语?
  • @DanielRoseman 在导入morning 时会自动打印消息。我没有意识到模块在导入时运行。感觉很笨。
  • @WeatherReport:当心,模块在 first 导入时运行。以下脚本:print 'First'; import morning ; print "Second" ; import morning 只会打印一次Good morning。不确定是否是预期的结果...

标签: python python-module


【解决方案1】:

您是否尝试过创建一个目录my_script,然后在该目录中创建一个__init__.py 文件?然后,您可以将整个脚本放入 __init__.py 文件中。

要从你的 python 程序运行脚本,你可以

import my_script
my_script

【讨论】:

    【解决方案2】:

    通常的用法是总是在一个模块中声明可以被其他模块使用的函数(和/或类),并在末尾添加一个if __name__ == '__main__': 测试以在直接调用脚本时直接执行某些内容。

    在你的例子中,它会给出:

    # morning.py
    def morning_func():
       print 'Good morning'
    
    
    if __name__ == '__main__':
        # call morning func
        morning_func()
    

    这样,您可以简单地以python morning.py 执行它,或者将其包含在其他Python 文件中以从那里调用morning_func

    【讨论】:

    • 这并不能直接解决我的问题,但可能对其他人有用。
    【解决方案3】:

    正如你所说的那样打电话早上很乱,我建议这样导入早上:

    # main.py
    from morning import morning_func as morning
    

    那么你可以这样称呼早上:

    morning()
    

    如果你想单独运行morning.py,就像@Serge Ballesta 说的那样修改morning.py

    # morning.py
    def morning_func():
       print 'Good morning'
    
    if __name__ == '__main__':
        morning_func()
    

    【讨论】:

      【解决方案4】:

      除了上面的答案之外,在这种情况下,最好的方法是逐行浏览原始的早间脚本并将操作包装在相关函数中。请在How to convert a Python script to module 上参考此食谱。

      【讨论】:

        猜你喜欢
        • 2020-05-20
        • 2019-03-01
        • 2022-01-15
        • 1970-01-01
        • 2018-05-28
        • 2013-07-24
        • 2014-04-25
        • 1970-01-01
        相关资源
        最近更新 更多