OSError:[WinError87]参数在

2024-04-27 03:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用python 3.4.3编写的python脚本,它会拉入一个包含ip地址、用户名和密码的.csv文件,以传递给另一个批处理脚本。

import pdb
import csv
import os
import subprocess
import datetime
import time
import signal
from multiprocessing import Process

def callGetDimmBatchFile(logFile, batchFileName, ipAddress, userName, passWord):
    print('\nId: {0}'.format(counter) + '\n', file=logFile, flush=True)
    command ='{0} -i {1} -u {2} -p {3}'.format(batchFileName, ipAddress, userName, passWord)
    print(command, file=logFile, flush=True)
    print("IP Address is {0}".format(ipAddress))
    print("User name is {0}".format(userName))
    print("Password is {0}".format(passWord))
    timeout = 60
    start = datetime.datetime.now()
    process = subprocess.Popen(command, stdout=logFile, stderr=logFile)
    while process.poll() is None:
        time.sleep(0.1)
        now = datetime.datetime.now()
        if (now - start).seconds > timeout:
            process.kill()
            # os.kill(process.pid, signal.SIGKILL)
            # os.waitpid(-1, os.Warning)
            return None
    rc = process.wait()
    print('\nReturn Code:', rc, file=logFile, flush=True)


logFile = open('log.txt', 'w+')
batchFileName = 'getfoo.bat'
pathToCsv = 'autorun-input.csv'
print('Path to CSV is {0}'.format(pathToCsv))
counter = 0
with open(pathToCsv) as csvFile:
    reader = csv.reader(csvFile, delimiter=',')
    for row in reader:
        ipAddress = row[0]
        userName = row[1]
        passWord = row[2]
        p = Process(target=callGetDimmBatchFile, args=(logFile, batchFileName, ipAddress, userName, passWord))
        p.start()
        p.join()


        #callGetDimmBatchFile(logFile, batchFileName, ipAddress, userName, passWord)

os.system("pause")

它读取的文件(autorun input.csv)如下:

10.69.69.1,taclab,taclab
10.69.69.2,taclab,taclab
10.69.69.3,taclab,taclab
10.69.69.4,taclab,taclab
10.69.69.5,taclab,taclab
10.69.69.6,taclab,taclab
10.69.69.7,taclab,taclab
10.69.69.8,taclab,taclab
10.69.69.9,taclab,taclab
10.69.69.10,taclab,taclab

它无法在多台Windows 7计算机上工作,错误如下:

C:\Users\Taclab\Desktop\DimmScript\Python-Project-9\Python-Project\DimmReport>python autorun.py
Path to CSV is autorun-input.csv
Traceback (most recent call last):
  File "autorun.py", line 44, in <module>
    p.start()
  File "C:\Python34\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Python34\lib\multiprocessing\context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python34\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Python34\lib\multiprocessing\popen_spawn_win32.py", line 66, in __ini
t__
    reduction.dump(process_obj, to_child)
  File "C:\Python34\lib\multiprocessing\reduction.py", line 59, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object

C:\Users\Taclab\Desktop\DimmScript\Python-Project-9\Python-Project\DimmReport>Tr
aceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python34\lib\multiprocessing\spawn.py", line 100, in spawn_main
    new_handle = steal_handle(parent_pid, pipe_handle)
  File "C:\Python34\lib\multiprocessing\reduction.py", line 81, in steal_handle
    _winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

我不明白哪个parameter不正确。似乎异常是在p.open引发的。


Tags: csvinpyimportisliblinemultiprocessing
1条回答
网友
1楼 · 发布于 2024-04-27 03:29:57

这种类型的错误通常是由于在没有可执行文件的情况下传递subprocess.Popen命令而导致的。例如:

subprocess.Popen(' -s') # notice the space at the beginning
subprocess.Popen(['','-s']) # this will cause the same error as well

检查日志(在错误发生之前,您已将变量'command'写入日志)以查看它是否因某种原因无效

如果没问题,那么我猜它一定是日志文件,因为父进程打开了它。 事实上,如果我尝试在我的pc上做同样的事情(我在python2.7上尝试过),它会引发一个不同的错误,关于日志文件已经关闭。

试着做一些类似的事情:

with open('tempLog{0}.log'.format(os.getpid(),'w+') as f:
    subprocess.Popen(command, stdout=f, stderr=f)

看看这是否有效

相关问题 更多 >