0

我有以下片段:

#!/usr/bin/env python

import sys

mypath = "D:\inetpub\wwwroot"

if mypath:
        try:
                print "Path: %s" % mypath
                if mypath.find("/"):
                        print "OS: Linux/Unix"
                elif mypath.find(":"):
                        print "OS: Windows"
                else:
                        print "OS: Unknown"
        except:
                print "Error"
else:
        print "[?] OS detection failure."

执行输出:

$ python test.py
Path: D:\inetpub\wwwroot
OS: Linux/Unix

我究竟做错了什么?正如我所料,我得到了相反的结果。还是有更好的方法来做到这一点?"/" -> Linux/Unix 和 ":" -> Windows

4

3 回答 3

3
#!/usr/bin/env python

import sys

mypath = "D:\\inetpub\\wwwroot"

if mypath:
        try:
                print "Path: %s" % mypath
                if mypath.find("/") >= 0:
                        print "OS: Linux/Unix"
                elif mypath.find(":"):
                        print "OS: Windows"
                else:
                        print "OS: Unknown"
        except:
                print "Error"
else:
        print "[?] OS detection failure."

您需要转义,\否则它将假定下一个字符具有特殊含义/二进制表示(例如\n´,\t`)。

或尝试:

mypath = r'D:\inetpub\wwwroot'

更好的方法是:

from os.path import abspath
print abspath('D:/inetpub/')

它会自动重新设计系统特定设计的路径,例如 / 用于 linux 和 \ 用于 Windows :)

或者你可以这样做:

import os
if os.name == 'nt':
    print 'Windows'
else:
    print 'Linux/Unix'
于 2013-05-11T08:43:42.767 回答
2

问题是您使用str.find. str.find返回字符串中子字符串的索引,-1否则。因为-1True在布尔上下文中,所以您输入了该if块。你真正想要的是in运营商:

>>> 'hello world'.find('foo')
-1
>>> bool(-1)
True
>>> 'foo' in 'hello world'
False

因此,您的代码现在应该如下所示:

#!/usr/bin/env python
import sys

mypath = r'D:\inetpub\wwwroot'  # use a raw string
if mypath:
    try:
        print 'Path:', mypath  # no need for formatting
        if '/' in mypath:
            print 'OS: Linux/Unix'
        elif ':' in mypath:
            print 'OS: Windows'
        else:
            print 'OS: Unknown'
    except:
        print 'Error'
else:
    print '[?] OS detection failure.'

一些建议:

  • str.format格式化时使用新方法。它功能更强大,推荐使用旧样式格式。
  • 你不应该有一个裸露except的 - 排除特定异常总是一个好主意,并且如果发生意外错误,则可以轻松调试。
于 2013-05-11T08:49:09.410 回答
1

你可以在

if "/" in mypath:
    print 'yay :)'

http://docs.python.org/2/library/stdtypes.html#str.find

仅当您需要知道 sub 的位置时才应使用 find() 方法。要检查 sub 是否是子字符串,请使用 in 运算符:

于 2013-05-11T08:50:10.360 回答