我在python3中有一个程序(temp.py
),用于读取太阳能电池板中传感器的温度。我还有一个用来控制步进电机的程序(stepper.py
)。程序stepper.py
使用sys.argv
来评估参数并确定电机应转动的距离和速度。我现在想从stepper.py
调用temp.py
来组合两个程序的功能。但是,当我从stepper.py
调用temp.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
看到"看到"争论?
答案 0 :(得分:2)
我不知道手动填充argv的方法,但这似乎并不是我实现目标的最佳方法。你试图在一个模块中调用另一个模块中的python函数,所以你应该使用Python的常规导入和函数调用机制,而不是通过重新调整用于处理命令行参数的argv。 Usig 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
。
答案 1 :(得分:0)
以下是等效的固定代码,附注如下:
def called(a, b):
return a*b, a+b
if __name__ == '__main__':
import sys
y=5
z=2
print(str(sys.argv))
print(len(sys.argv[1:]))
p, q = called(y, z)
print(p, q)
正如TroyHurts所写,将核心功能与功能分开,将主体分离到if __name__ == '__main__':
阻止。
然后,您就可以在import stepper
中temp.py
了。如果sys.argv
中需要temp.py
,请导入sys
中的temp.py
。
import sys
中的stepper.py
如果未在函数定义中使用,甚至可以移动到if
块。
函数(在stepper.py
中)应该将所有输入作为函数参数。他们应该通过return
声明返回所有内容。
绝不使用global
。
called
不是一个很好的标识符。选择更好的一个。 ;)