将参数传递给已定义的函数,以便python3中的sys.argv可以访问它们

时间:2018-01-05 13:30:18

标签: python-3.x parameter-passing user-defined-functions

我在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看到"看到"争论?

2 个答案:

答案 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 steppertemp.py了。如果sys.argv中需要temp.py,请导入sys中的temp.py

import sys中的stepper.py如果未在函数定义中使用,甚至可以移动到if块。

函数(在stepper.py中)应该将所有输入作为函数参数。他们应该通过return声明返回所有内容。

绝不使用global

called不是一个很好的标识符。选择更好的一个。 ;)