您可以通过 PowerShell 从 python 脚本传输非文本数据吗?

Can you pipe non-text data from a python script via PowerShell?

我相当熟悉 bash 并且知道如何编写一些涉及管道的基本脚本,并按顺序将它们用作 'back end' 到 运行 python 脚本.

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

我的问题是:

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

类似于:

script1.py | script2.py

如果是这样,python 脚本的后勤工作是什么? I.E 你还能 return 到 sys.stdout 吗?

编辑:

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

我有两个 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 或其他字符串编码)

不幸的是,从 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 代码页,当输出到 console 以外的其他内容时 Python 默认为(偏离使用活动 OEM 代码页的通常行为) .

      • WindowsPowerShell(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:见;在这种情况下,请使用以下内容:

       [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
      
    • 有关详细信息,请参阅