【问题标题】:Can you pipe non-text data from a python script via PowerShell?您可以通过 PowerShell 从 python 脚本中传输非文本数据吗?
【发布时间】:2021-10-09 20:06:27
【问题描述】:

我对 bash 相当熟悉,并且知道如何编写一些涉及管道的基本脚本,并将它们用作“后端”来按顺序运行 python 脚本。

但是,对于我负责的新项目,我只能使用 PowerShell。我发现我可以很好地重写我以前的 shell 脚本,但是我听说你也可以在 PowerShell 中管道非文本数据。

我的问题是:

是否可以通过 PowerShell 将 Python 脚本中的非文本输出(主要是 pandas 数据帧)通过管道传输到另一个 Python 脚本中?

类似于:

script1.py | script2.py

如果是这样,关于 python 脚本的后勤工作是什么? IE 你还能回sys.stdout吗?

编辑

为了更好地解释用例以符合我收到的 cmets。

我有两个 python 脚本,test1.py:

#test1.py
import pandas as pd
import sys


def main():
    columns = ['A', 'B', 'C']
    data = [
        ['hello', 0,  3.14],
        ['world', 1,  2.71],
        ['foo',   2,  0.577],
        ['bar',   3,  1.61]

    ]

    df = pd.DataFrame(data, columns=columns)
    return df


if __name__ == "__main__":
    main().to_csv(sys.stdout, index_label=False)

test2.py:

#test2.py
import pandas as pd
import sys


def main():
    df = pd.read_csv(sys.stdin)
    print(df.dtypes)


if __name__ == "__main__":
    main()

我正在使用 PowerShell 进行一些自动化操作,并且需要将一个脚本的输出通过管道传输到另一个; python test1.py | python test2.py 工作得很好。

我的问题是,我听说您可以在 PowerShell 中传输非文本数据,而在 Bash 中无法做到这一点(我认为),那么是否可以按原样传输 Dataframe? (无需转换为 CSV 或其他字符串编码)

【问题讨论】:

  • 为什么在地球上你需要这样做? [皱眉]您一个接一个地运行 2 个 python 实例......所以只需使用 python 编码方法从一个到另一个获取信息。 powershell 在这种情况下没有任何位置。
  • 也许作者只能控制一个或没有一个python源文件。也许这个过程已经在 linux 上运行了多年,他们希望将它移植到 windows 而不重写逻辑。这似乎是一个合理的问题,尽管我确实鼓励原始海报展示他们迄今为止所做的更多尝试。
  • 感谢大家的反馈。 [grin] 需要将一个 python 脚本输出提供给第二个似乎仍然很奇怪......但不要使用 python 来做到这一点。
  • @Lee_Dailey 不用担心!
  • 在那篇文章的核心内容中,有一些关于 powershell | 总是进行编码的讨论,因此无法传输二进制数据。我不知道足够多的 powershell 来提供真正的帮助。

标签: python python-3.x powershell pipe powershell-3.0


【解决方案1】:

不幸的是,从 PowerShell 7.2 开始,支持 PowerShell 管道中的二进制数据(原始字节)

解决方法使用cmd.exe /c(在Windows上;在类Unix平台上,使用/bin/sh -c):

cmd /c 'script1.py | script2.py'

注意:

  • 如果您还想捕获原始字节输出在 PowerShell

    • cmd /c 命令字符串中包含输出重定向 (>);例如:

      cmd /c 'script1.py | script2.py > out.bin'
      
    • 然后使用Get-Content -Encoding Byte (Windows PowerShell) / Get-Content -AsByteStream (PowerShell (Core) 7+) 读取该文件字节

  • 相比之下,如果您希望cmd /c调用的输出作为文本(字符串)

    • 您必须(暂时)[Console]::OutputEncoding 设置为系统的活动 ANSI 代码页,Python 在输出到控制台以外的其他东西时默认使用该代码页(与使用活动 OEM 代码页的通常行为不同)。

      • Windows PowerShell(最高 5.1 的版本)中,您可以按如下方式进行:

        [Console]::OutputEncoding = [System.Text.Encoding]::Default
        
        • 注意:在 PowerShell (Core) 7+ 中,需要做更多工作:

          [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemPropertyValue HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage ACP))
          
    • 请注意,您还可以将 Python 配置为默认输出 UTF-8:参见this answer;在这种情况下,请使用以下内容:

       [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
      
    • 请参阅this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多