簡體   English   中英

在 Python 子進程中運行 protoc

[英]Running protoc in Python subprocess

我有我的.proto 在文件夾workspace_directory/sub_directory/proto_files中定義的文件。

當我運行時:

protoc --python_out=workspace_directory -I workspace_directory/sub_directory/proto_files workspace_directory/sub_directory/proto_files/*

output python 代碼在workspace_directory/proto_files中生成,這就是我想要的。

我的主要目標是將該命令作為 Python 中構建腳本的一部分運行,因此我嘗試使用 subprocess.run subprocess.run()來實現這一目標。 在 Python 我運行:

subprocess.run(shlex.split("protoc --python_out=workspace_directory -I workspace_directory/sub_directory/proto_files workspace_directory/sub_directory/proto_files/*"))

我明白了

無法使原始路徑相對:workspace_directory/sub_directory/proto_files/*:沒有這樣的文件或目錄

其他一些需要注意的事項:

  • workspace_directory是完全限定的路徑。 它就像/home/user/workspace_directory ,所以我不相信我應該有任何相對路徑問題。
  • 我使用shlex.split()所以我可以復制/粘貼命令,以確保它盡可能准確。

感覺就像我在使用subprocess模塊時遺漏了一些東西,但似乎看不到它。

我能夠找到解決方案。 我仍然不確定為什么傳遞 arguments 序列和使用帶有shell=True的字符串之間的區別

子流程文檔

所有調用都需要 args,它應該是一個字符串,或一個程序序列 arguments。 提供 arguments 的序列通常是首選,因為它允許模塊處理任何所需的 escaping 和 arguments 的引用(例如,允許文件名中的空格)。 如果傳遞單個字符串,則 shell 必須為 True(見下文),否則字符串必須簡單地命名要執行的程序而不指定任何 arguments。

我一直在提供 arguments 的序列,但沒有得到我想要的結果。 傳遞一個字符串並設置shell=True使它工作。

subprocess.run("protoc --python_out=workspace_directory -I workspace_directory/sub_directory/proto_files workspace_directory/sub_directory/proto_files/*", shell=True)

protoc --python_out=workspace_directory -I workspace_directory/sub_directory/proto_files workspace_directory/sub_directory/proto_files/*

當您在bash或其他 shell 中正常執行此命令時,shell 會檢測到*通配符並將其轉換為匹配的文件名列表。

subprocess.run( subprocess.run()shlex.split()都不做任何通配符處理,因此protoc按原樣接收文本並嘗試打開一個字面上稱為*的文件,但它無法找到該文件。 錯誤消息有點令人困惑,但包含原因: No such file or directory

只要您可以信任命令中包含的所有文本字符串,通過 shell 調用命令是一個合理的解決方案。 或者,您可以使用 Python glob模塊將通配符擴展為路徑列表並將其包含在命令中。 如果文件名可能包含特殊字符,那會更安全。


(您可能還想知道protocgrpcio-tools中可作為 Python 模塊使用,並且可以使用import grpc_tools.protoc; grpc_tools.protoc(['protoc', '-I...', 'myproto.proto']) . This avoids having to go through a subprocess, and can be easier to install using the Python pip package manager.)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM