我有一个 python3 程序(temp.py
),可以读取太阳能电池板传感器的温度。我还有一个程序 (stepper.py
),用于控制步进电机。程序 stepper.py
使用 sys.argv
来评估参数并确定电机应转动多远和多快。我现在想从 temp.py
调用 stepper.py
来组合两个程序的功能。但是,当我从 temp.py
调用 stepper.py
时,参数不会以 sys.argv
可以使用它们的方式传递。我写了一个简短的脚本来说明我的问题:
import sys
y=5
z=2
def called(a,b):
print(str(sys.argv))
print(len(sys.argv[1:]))
global p,q
p=a*b
q=a+b
called(y,z)
print(p,q)
此脚本返回以下内容:
['/home/pi/calling.py']
0
10 0
换句话说,虽然参数的计算已经完成,但是 sys.argv
表示没有传递任何参数,只是显示 argv[0]
其中是程序的名称。我明白为什么会发生这种情况,但是有什么方法可以让 sys.argv“查看”参数吗?
最佳答案
我不知道手动填充 argv 的方法,但这对我来说似乎并不是实现目标的最佳方法。您正在尝试从一个模块中调用另一个模块中的 python 函数,因此您应该使用 Python 的正常导入和函数调用机制来执行此操作,而不是通过重新利用 argv(旨在处理命令行参数)。使用python的if __name__ == "__main__"
构造中,您仍然可以将命令行参数传递给函数。
如果您还没有这样做,这将需要将模块中的代码包装到具有明确定义的参数的函数中。以下是我所描述的方法的示例:
# stepper.py
import sys
def turn_motor(rotations, speed=1):
"""Turns the stepper motor"""
if __name__ == "__main__":
# Code in this block will run when stepper.py is invoked from the command line
turn_motor(rotations=sys.argv[1], speed=sys.argv[2])
以及您的其他文件
# temp.py
import sys
from stepper import turn_motor
def detect_temp():
"""Returns the current temperature"""
def turn_when_hot(threshold):
"""Turns stepper motor when temperature above given threshold"""
temperature = detect_temp()
if temperature > threshold:
# Calls the turn_motor function directly with whatever arguments
# you like, without having to mess with sys.argv
turn_motor(revolutions=3, speed=1.2)
if __name__ == "__main__":
turn_when_hot(sys.argv[1])
因此,您可以从命令行调用stepper.py,并使用转弯和速度参数,或者您可以使用温度阈值参数调用temp.py,它会调用stepper.turn_motor
直接。
关于python-3.x - 将参数传递给定义的函数,以便它们可以在 python3 中访问 sys.argv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48114636/