如何将带输入参数的py脚本转为exe,并在另一个py脚本中调用exe

How to convert py script with input parameters to exe, and call the exe in another py script

我是 Python 的新手。为了运行 py script1在没有这些库的系统中引用了一些第三方库,我尝试通过pyinstaller将py转换为exe,并在另一个py script2中调用exe,代码大概是这样的这个:

脚本 1:

def func(x):
    c = sum(x)
    print(c)

我运行

pyinstaller -F -w script1.py  -->script1.exe

脚本 2:

impose subprocess
x = [1,2,3]
subprocess.run([r"...\script1.exe",x])

以上代码无效。我猜是参数t运行sfer的问题,我找到了sys.argv[] t运行sfer的方法,不过好像也不能解决我的问题

如果你想 运行 .exe 带参数那么你必须

  • 使用 sys.argv 获取参数,但您必须跳过第一个元素,即程序名称 - sys.argv[1:]
  • 将所有值转换为 int() 因为它只能以字符串形式发送值
  • 运行 你的函数带有参数 `func(values)
import sys

def func(x):
    c = sum(x)
    print(c)
    
if __name__ == '__main__':    
    values = []
    
    for item in sys.argv[1:]:
        values.append( int(item) )
        
    func(values)    

在转换为 .exe 之前,您应该测试您的代码

python.exe script1.py 1 2 3 

当你执行它时,你必须使用带字符串的平面列表(因为它只能发送字符串)

run( [r"...\script1.exe", '1', '2', '3'] )

但是你有嵌套列表,而且这个列表有整数值

run( [r"...\script1.exe", [1, 2, 3] ] )

所以你需要这样的东西

import subprocess

x = [1, 2, 3]

items = []

for value in x:
    items.append( str(value) )

# add two lists to create one flat list
subprocess.run( [r"...\script1.exe"] + items )  

您可以使用 list comprehensionmap()

来减少代码
import sys

def func(x):
    c = sum(x)
    print(c)

if __name__ == '__main__':    
    values = [int(item) for item in sys.argv[1:] ]
    #values = list(map(int, sys.argv[1:]))
        
    func(values)    

import subprocess

x = [1, 2, 3]

items = [str(value) for value in x]
#items = list(map(str, x))

subprocess.run( [r"...\script1.exe"] + items )

编辑:

func() 必须使用 print() 将结果发送回第一个脚本。

并且第一个脚本必须捕获输出 (stdout)

process = subprocess.run( [r"...\script1.exe"] + items, capture_output=True)

text = process.stdout.decode()
result = int( text )

print(result)