【问题标题】:Passing argument to a defined function so they accessible to sys.argv in python3将参数传递给定义的函数,以便它们可以访问 python3 中的 sys.argv
【发布时间】:2018-01-05 13:30:17
【问题描述】:

我在 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“看到”这些论点?

【问题讨论】:

  • 你在 stepper.py 中使用导入还是子进程调用你的代码?

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


【解决方案1】:

我不知道手动填充 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

【讨论】:

    【解决方案2】:

    这是等效的固定代码,注释如下:

    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__': 块分开。

    然后你就可以在你的temp.pyimport stepper。如果你在temp.py中需要sys.argv,请在temp.py中导入sys

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

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

    永远不要使用global

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

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2021-12-29
      • 2015-04-04
      • 2021-07-30
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多