为什么subprocess.py会抛出一个WindowsError?

时间:2016-06-23 23:57:58

标签: python windows postgresql subprocess windowserror

我正在尝试使用testing.postgresql包测试一些脚本,并在实例化testing.postgresql.Postgresql()或testing.postgresql.PostgresqlFactory()时遇到此错误:

File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\testing\common\database.py", line 83, in __init__
  self.initialize()
File "C:\Python27\lib\site-packages\testing\postgresql.py", line 50, in initialize
  self.initdb = find_program('initdb', ['bin'])
File "C:\Python27\lib\site-packages\testing\postgresql.py", line 134, in find_program
  path = get_path_of(name)
File "C:\Python27\lib\site-packages\testing\common\database.py", line 288, in get_path_of
  stderr=subprocess.PIPE).communicate()[0]
File "C:\Python27\lib\subprocess.py", line 710, in __init__
  errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 960, in _execute_child
  startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

通过跟踪跟踪和在线搜索,我发现,subprocess.py无法找到initdb.exe。究竟为什么通过subprocess.py传递给扩展模块_subprocess.c变得更加模糊。

我已经尝试将包含initdb的目录添加到系统PATH,没有骰子。

是否有其他人遇到过这个问题,或者对此处发生的事情有任何见解?

1 个答案:

答案 0 :(得分:1)

查看来源,它似乎与Windows兼容。该软件包需要一个UNIX风格的环境。

testing.postgresql/src/testing/postgresql.py

def find_program(name, subdirs):
     path = get_path_of(name)
     if path:
        return path

    for base_dir in SEARCH_PATHS:
        for subdir in subdirs:
            path = os.path.join(base_dir, subdir, name)
            if os.path.exists(path):
                return path

     raise RuntimeError("command not found: %s" % name)

testing.common.database

def get_path_of(name):
     path = subprocess.Popen(['/usr/bin/which', name],
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE).communicate()[0]
     if path:
         return path.rstrip().decode('utf-8')
     else:
         return None

已编辑,以显示以下@ eryksun评论的正确问题来源。