mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. _faq:
 | 
						|
 | 
						|
==========================
 | 
						|
Frequently Asked Questions
 | 
						|
==========================
 | 
						|
 | 
						|
.. currentmodule:: gpiozero
 | 
						|
 | 
						|
 | 
						|
.. _keep-your-script-running:
 | 
						|
 | 
						|
How do I keep my script running?
 | 
						|
================================
 | 
						|
 | 
						|
The following script looks like it should turn an LED on::
 | 
						|
 | 
						|
    from gpiozero import LED
 | 
						|
 | 
						|
    led = LED(17)
 | 
						|
    led.on()
 | 
						|
 | 
						|
And it does, if you're using the Python (or IPython or IDLE) shell. However,
 | 
						|
if you saved this script as a Python file and ran it, it would flash on
 | 
						|
briefly, then the script would end and it would turn off.
 | 
						|
 | 
						|
The following file includes an intentional :func:`~signal.pause` to keep the
 | 
						|
script alive::
 | 
						|
 | 
						|
    from gpiozero import LED
 | 
						|
    from signal import pause
 | 
						|
 | 
						|
    led = LED(17)
 | 
						|
    led.on()
 | 
						|
 | 
						|
    pause()
 | 
						|
 | 
						|
Now the script will stay running, leaving the LED on, until it is terminated
 | 
						|
manually (e.g. by pressing Ctrl+C). Similarly, when setting up callbacks on
 | 
						|
button presses or other input devices, the script needs to be running for the
 | 
						|
events to be detected::
 | 
						|
 | 
						|
    from gpiozero import Button
 | 
						|
    from signal import pause
 | 
						|
 | 
						|
    def hello():
 | 
						|
        print("Hello")
 | 
						|
 | 
						|
    button = Button(2)
 | 
						|
    button.when_pressed = hello
 | 
						|
 | 
						|
    pause()
 | 
						|
 | 
						|
 | 
						|
My event handler isn't being called?
 | 
						|
====================================
 | 
						|
 | 
						|
When assigning event handlers, don't call the function you're assigning. For
 | 
						|
example::
 | 
						|
 | 
						|
    from gpiozero import Button
 | 
						|
 | 
						|
    def pushed():
 | 
						|
        print("Don't push the button!")
 | 
						|
 | 
						|
    b = Button(17)
 | 
						|
    b.when_pressed = pushed()
 | 
						|
 | 
						|
In the case above, when assigning to ``when_pressed``, the thing that is
 | 
						|
assigned is the *result of calling* the ``pushed`` function. Because ``pushed``
 | 
						|
doesn't explicitly return anything, the result is ``None``. Hence this is
 | 
						|
equivalent to doing::
 | 
						|
 | 
						|
    b.when_pressed = None
 | 
						|
 | 
						|
This doesn't raise an error because it's perfectly valid: it's what you assign
 | 
						|
when you don't want the event handler to do anything. Instead, you want to
 | 
						|
do the following::
 | 
						|
 | 
						|
    b.when_pressed = pushed
 | 
						|
 | 
						|
This will assign the function to the event handler *without calling it*. This
 | 
						|
is the crucial difference between ``my_function`` (a reference to a function)
 | 
						|
and ``my_function()`` (the result of calling a function).
 | 
						|
 | 
						|
 | 
						|
Why do I get PinFactoryFallback warnings when I import gpiozero?
 | 
						|
================================================================
 | 
						|
 | 
						|
You are most likely working in a virtual Python environment and have forgotten
 | 
						|
to install a pin driver library like ``RPi.GPIO``. GPIO Zero relies upon lower
 | 
						|
level pin drivers to handle interfacing to the GPIO pins on the Raspberry Pi,
 | 
						|
so you can eliminate the warning simply by installing GPIO Zero's first
 | 
						|
preference:
 | 
						|
 | 
						|
.. code-block:: console
 | 
						|
 | 
						|
    $ pip install rpi.gpio
 | 
						|
 | 
						|
When GPIO Zero is imported it attempts to find a pin driver by importing them
 | 
						|
in a preferred order (detailed in :doc:`api_pins`). If it fails to load its
 | 
						|
first preference (``RPi.GPIO``) it notifies you with a warning, then falls back
 | 
						|
to trying its second preference and so on. Eventually it will fall back all the
 | 
						|
way to the ``native`` implementation. This is a pure Python implementation
 | 
						|
built into GPIO Zero itself. While this will work for most things it's almost
 | 
						|
certainly not what you want (it doesn't support PWM, and it's quite slow at
 | 
						|
certain things).
 | 
						|
 | 
						|
If you want to use a pin driver other than the default, and you want to
 | 
						|
suppress the warnings you've got a couple of options:
 | 
						|
 | 
						|
1. Explicitly specify what pin driver you want via an environment variable. For
 | 
						|
   example:
 | 
						|
 | 
						|
   .. code-block:: console
 | 
						|
 | 
						|
       $ GPIOZERO_PIN_FACTORY=pigpio python3
 | 
						|
 | 
						|
   In this case no warning is issued because there's no fallback; either the
 | 
						|
   specified factory loads or it fails in which case an :exc:`ImportError` will
 | 
						|
   be raised.
 | 
						|
 | 
						|
2. Suppress the warnings and let the fallback mechanism work::
 | 
						|
 | 
						|
    >>> import warnings
 | 
						|
    >>> warnings.simplefilter('ignore')
 | 
						|
    >>> import gpiozero
 | 
						|
 | 
						|
   Refer to the :mod:`warnings` module documentation for more refined ways to
 | 
						|
   filter out specific warning classes.
 | 
						|
 | 
						|
 | 
						|
How can I tell what version of gpiozero I have installed?
 | 
						|
=========================================================
 | 
						|
 | 
						|
The gpiozero library relies on the setuptools package for installation
 | 
						|
services.  You can use the setuptools ``pkg_resources`` API to query which
 | 
						|
version of gpiozero is available in your Python environment like so:
 | 
						|
 | 
						|
.. code-block:: pycon
 | 
						|
 | 
						|
    >>> from pkg_resources import require
 | 
						|
    >>> require('gpiozero')
 | 
						|
    [gpiozero 1.4.0 (/usr/lib/python3/dist-packages)]
 | 
						|
    >>> require('gpiozero')[0].version
 | 
						|
    '1.4.0'
 | 
						|
 | 
						|
If you have multiple versions installed (e.g. from ``pip`` and ``apt``) they
 | 
						|
will not show up in the list returned by the ``require`` method. However, the
 | 
						|
first entry in the list will be the version that ``import gpiozero`` will
 | 
						|
import.
 | 
						|
 | 
						|
If you receive the error ``No module named pkg_resources``, you need to install
 | 
						|
``pip``. This can be done with the following command in Raspbian:
 | 
						|
 | 
						|
.. code-block:: console
 | 
						|
 | 
						|
    $ sudo apt install python3-pip
 | 
						|
 | 
						|
Alternatively, install pip with `get-pip`_.
 | 
						|
 | 
						|
.. _get-pip: https://pip.pypa.io/en/stable/installing/
 |