python-3.x - 将参数传递给定义的函数,以便它们可以在 python3 中访问 sys.argv

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

我有一个 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/

相关文章:

c++ - 无法通过 boost::phoenix::function 调用带参数的惰性 lambda 函数

c++ - C++重载通用方法,按引用和按值

hadoop - pig udf计算博客中的时间差

python - 当只打开一个连接时,为什么 redis pub 和 sub 被认为是不同的客户端?

python - 您如何让机器人使用自定义表情符号添加 react ?

python - 在 Python 中获取字节数的模数

javascript - 从一个方法传递参数到另一个方法似乎不会改变 typescript 中的参数

sql-server - 将表值函数选择到@temp_table中

javascript - 带有数组的 Bigquery javascript UDF

python - ValueError:使用套接字和 ssl 模块时 check_hostname 需要 server_hostname