2013-08-27 31 views
4

我试图确定如果操作系统是基于Unix从Python脚本。我能想到的两种方法可以做到这一点,但它们都有缺点:如何确定Python脚本运行的操作系统是否类Unix?

  • 检查platform.system()是一个元组,如("Linux", "Darwin")。问题在于我不想提供每一个类Unix系统的列表,特别是有很多* BSD变种。如果函数os.fchmod存在
  • 检查,因为这个功能仅在Unix可用。这似乎不是一个干净的或“Pythonic”的方式来做到这一点。
+5

[EAFP](http://docs.python.org/ 2/glossary.html) - 只需让脚本执行所有操作即可。它可能会在Windows上失败;只要确定它不符合你的要求即可。 –

+1

检查'os.name =='posix''? – geoffspear

+0

如何检查它是否不包含“Windows”? – shahkalpesh

回答

5

的Python的方式做到这一点是不关心你是在什么平台上。

如果有多个不同的设备来完成取决于平台的东西,那么他们的抽象的函数或类的后面,它应该尝试的设施,如果该设施不适用于当前平台上移动到另一个。

+0

这似乎是一个明智的做法。您如何建议在代码中实施“尝试并继续”过程? 像这样: '尝试: something_for_windows() 除外: something_for_unix()'? 如果是的话,将如何实现它,如果你是针对两种以上不同类型的操作系统(例如:在Windows,Linux和Mac /达尔文)? – user2722730

+0

@ user2722730尝试/除了是做到这一点的一种方法。如果有问题的API返回错误代码,如果该设施不存在,那么您将测试它们。如果你有两个以上,那么你会继续嵌套这些控制结构。或者,一旦你知道哪个设施被支持,你可以换掉默认的“尝试一堆东西”的实施,以调用检测到的设施。 – cdhowie

+0

我需要导入特定于平台的Python模块来执行平台特定的任务,因此没有API错误代码。要按照我提到的3个平台的建议来做到这一点,我需要尝试一下 - 除了尝试 - 除外。这看起来像一个丑陋的方式来做到这一点,特别是因为3是一个奇数,最后除了它里面没有代码,或者我需要手动重新引发任何异常被捕获的Python脚本退出并打印错误。 – user2722730

5
import sys 
if 'win' in sys.platform(): 
    #windows 
else: 
    #not windows 

,或者你可以尝试导入平台相关的库

try: 
    import windows_only as generic 
except ImportException: 
    try: 
      import unix_only as generic 
    except ImportException: 
      import stdlib.module as generic 

print generic.common_function() 

,然后还有的总是可靠

>>> import os 
>>> os.name 
nt 
+0

请注意,'os.name'可能是OP想要的粒度 - “”类Unix系统的“posix”,Windows的“nt”'。文档说'posix','nt','os2','ce','java'和'riscos'正在使用中。 –

相关问题