如何从 Python 脚本中运行 Streamlit 应用程序?

Dav*_*vid 7 python streamlit

有没有办法streamlit run APP_NAME.py从 python 脚本中运行命令,它可能看起来像:

import streamlit
streamlit.run("APP_NAME.py")
Run Code Online (Sandbox Code Playgroud)


由于我正在处理的项目需要跨平台(并打包),因此我不能安全地依赖对os.system(...)或的调用subprocess

Dav*_*vid 9

希望这对其他人有用:我查看了我的 python/conda bin 中的实际 streamlit 文件,它有以下几行:

import re
import sys
from streamlit.cli import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
Run Code Online (Sandbox Code Playgroud)

从这里,您可以看到streamlit run APP_NAME.py在命令行上运行是相同的(在 python 中):

import sys
from streamlit import cli as stcli

if __name__ == '__main__':
    sys.argv = ["streamlit", "run", "APP_NAME.py"]
    sys.exit(stcli.main())
Run Code Online (Sandbox Code Playgroud)

所以我把它放在另一个脚本中,然后运行该脚本从 python 运行原始应用程序,它似乎工作。我不确定这个答案是如何跨平台的,因为它仍然在某种程度上依赖于命令行参数。

  • **更新:** [“streamlit.cli”子模块已移至“streamlit.web.cli”](/sf/answers/5146650491/)。我可以亲自验证 API 在其他方面看起来是相同的。嘎!为什么 Streamlit 不直接从后者添加一个简单的别名到前者以保持向后兼容性?Streamlit,这在 2022 年“不太”好看——说实话。*不酷。* (7认同)
  • **损坏。** 从 Streamlit 0.12.0 开始,`streamlit.cli` 子模块不再存在:`ImportError: 无法从 'streamlit' 导入名称 'cli' (/usr/lib/python3.10/site-packages/ Streamlit/__init__.py)`。不稳定的上游 API 是我们无法获得稳定的 StackOverflow 答案的原因。`</叹气>` (2认同)

小智 8

您可以从 python 运行脚本,如下所示python my_script.py

import sys
from streamlit import cli as stcli
import streamlit
    
def main():
# Your streamlit code

if __name__ == '__main__':
    if streamlit._is_running_with_streamlit:
        main()
    else:
        sys.argv = ["streamlit", "run", sys.argv[0]]
        sys.exit(stcli.main())
Run Code Online (Sandbox Code Playgroud)


Sub*_*rma 5

我更喜欢使用子进程,它使得通过另一个 python 脚本执行许多脚本变得非常容易。

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions:

import subprocess
import os

process = subprocess.Popen(["streamlit", "run", os.path.join(
            'application', 'main', 'services', 'streamlit_app.py')])
Run Code Online (Sandbox Code Playgroud)