如何将带输入参数的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 comprehension
或 map()
来减少代码
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)
我是 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 comprehension
或 map()
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)