如何防止 python 解释器查看和导入未安装的模块;不属于系统?

How do I prevent python interpreter to see and import modules that are not installed; do not belong to the system?

问题的简短版本:

如何防止 python 解释器查看和导入未安装的模块;不属于我正在使用的系统;如果我选择 运行 系统 X 而不是系统 Y 下的代码,则不需要?

从 C 的角度来看,我会在这些方面做一些事情:

#if defined(__SerialCOM__)
// Do stuff, import stuff
#elif defined(__SPI_Over_Raspberry__)
// Do stuff, import stuff
#elif defined(__SPI_Over_BeagleBone__)
// Do stuff, import stuff
#endif

我想避免为不同的板创建不同的项目。这个我知道怎么做。


长版

我正在尝试在我的项目中实现一个接口,以与德克萨斯州的 ADC IC 进行通信。 最终目标是能够使用多种不同的设备读取它:

ADC <---SPIbus (With C code)---> ArduinoDue <-----Serial (With Python)----> LinuxPC
ADC <---SPIbus (With Python)---> Raspberry Pi3
ADC <---SPIbus (With Python)---> BeagleBone Black
ADC <---SPIbus (With Python)---> Intel Edson

为此,我创建了一个接口,它接收一个 reader 对象,这个 reader 对象继承自抽象 reader class.

我想避免为不同的板创建不同的项目。这个我知道怎么做。

readerhandler.py

from readers import SerialReader,PiSPIreader


class ReaderHandler:
    def __init__(self, readertype="PiSPI"):
        self.reader = self.getreader(readertype)

    def getreader(self, readertype):
        aReader = []
        if readertype == "PiSPI":
            aReader = PiSPIreader()
        elif readertype == "Serial":
            aReader = SerialReader()
        elif readertype == "BBSPI":
            aReader = BBSPIreader()
        else:
            print("reader type invalid")
        return aReader
    # Do other stuff

readers.py

from abc import ABCMeta, abstractmethod
import serial  # For Serial Reader object (Should only be interpreted in a pc device)
import piSPI  # For piSPI Reader object (Should only be interpreted in a RasberryPi device)
import bbSPI  # For bbSPI Reader object (Should only be interpreted in a BeagleBone Black device)


class Reader(object): # My abstract class
    __metaclass__ = ABCMeta

    @abstractmethod
    def initialization(self):
    """Acquisitions setup"""

    @abstractmethod
    def _run(self):
        """function that acquires sample from device port on the bakcground"""

    @abstractmethod
    def readdata(self, nofsamples=100):
    """Read X buffered samples"""

class SerialReader(Reader): # (Should only be interpreted in a PC device)
    def __init__(self, portname='/dev/ttyACM2', baudrate=115200, magic0=0x42, magic1=0x41):
        super(SerialReader, self).__init__()
        self.ser = serial.Serial(portname, baudrate=baudrate, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=None)

    # Implements other abstract methods and **uses Serial object***


class PiSPIreader(Reader): # (Should only be interpreted in a Rasberry device)
    def __init__(self):
        super(PiSPIreader, self).__init__()
        self.piSPI = piSPI.SPI()

    # Implements other abstract methods and **uses piSPI object***


class BBSPIreader(Reader): # (Should only be interpreted in a BeagleBone Black device)
    def __init__(self):
        super(BBSPIreader, self).__init__()
        self.bbSPI = bbSPI.SPI()

    # Implements other abstract methods and **uses bbSPI object***

使用try/except.

try:
    import serial
except ImportError:
    pass    # couldn't import serial, so do nothing
else:       # we successfully imported serial, so define the class that uses it

    class SerialReader(Reader): # (Should only be interpreted in a PC device)
        def __init__(self, portname='/dev/ttyACM2', baudrate=115200, magic0=0x42, magic1=0x41):
            super(SerialReader, self).__init__()
            self.ser = serial.Serial(portname, baudrate=baudrate, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=None)

        # Implements other abstract methods and **uses Serial object***

How to check if a python module exists without importing it

您也可以使用 os.name 来检测设备类型。