2013-02-11 23 views
2

Не знаете, почему эта ошибка появляется. Я искал вокруг безрезультатно. Я решил взять пунт, чтобы сделать мой скрипт многопоточным, используя модуль многопроцессорности, и если я удалю этот код, сценарий будет работать нормально.Python multiprocessing builtins.IOError: [Errno 22] Недопустимый аргумент

Итак, я запустил отладчик, и он также не сталкивается с какой-либо ошибкой с многопоточным кодом, который кажется немного странным. Но когда я пытаюсь запустить скрипт как раз нормально, он печатает под 3.2.3:

Python 3.2.3 (default, Apr 11 2012, 07:12:16) [MSC v.1500 64 bit (AMD64)] 
Type "help", "copyright", "credits" or "license" for more information. 
[evaluate scratch.py] 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python32\Lib\multiprocessing\forking.py", line 369, in main 
    self = load(from_parent) 
AttributeError: 'module' object has no attribute 'search_letters_in_words' 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 122, in <module> 
    File "C:\Python32\Lib\multiprocessing\process.py", line 132, in start 
    self._popen = Popen(self) 
    File "C:\Python32\Lib\multiprocessing\forking.py", line 269, in __init__ 
    to_child.close() 
builtins.IOError: [Errno 22] Invalid argument 

Edit: я переключился на 3.3, чтобы увидеть, что происходит, и он unconsistently последовательно бросает один из этих двух tracebacks:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] 
Type "help", "copyright", "credits" or "license" for more information. 
[evaluate scratch.py] 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python33\Lib\multiprocessing\forking.py", line 344, in main 
    self = load(from_parent) 
AttributeError: 'module' object has no attribute 'search_letters_in_words' 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 122, in <module> 
    File "C:\Python33\Lib\multiprocessing\process.py", line 111, in start 
    self._popen = Popen(self) 
    File "C:\Python33\Lib\multiprocessing\forking.py", line 243, in __init__ 
    dump(process_obj, to_child, HIGHEST_PROTOCOL) 
    File "C:\Python33\Lib\multiprocessing\forking.py", line 160, in dump 
    ForkingPickler(file, protocol).dump(obj) 
builtins.BrokenPipeError: [Errno 32] Broken pipe 

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] 
Type "help", "copyright", "credits" or "license" for more information. 
[evaluate scratch.py] 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python33\Lib\multiprocessing\forking.py", line 344, in main 
    self = load(from_parent) 
AttributeError: 'module' object has no attribute 'search_letters_in_words' 

Edit # 2 Добавлено отслеживающий при вызове из командной строки:

D:\Python\PythonRepo>scratch.py > d:\download\error.txt 
Traceback (most recent call last): 
    File "D:\Python\PythonRepo\scratch.py", line 122, in <module> 
    thread.start() 
    File "C:\Python32\Lib\multiprocessing\process.py", line 131, in start 
    from .forking import Popen 
    File "C:\Python32\Lib\multiprocessing\forking.py", line 180, in <module> 
    import _subprocess 
ImportError: No module named '_subprocess' 

Вот многопроцессорная код, который я написал до сих пор. Это может быть (ха-ха-ха, я шучу, наверное!) Глючит, но я не уверен, что не так, потому что это выглядит правильно (не всегда)?

wordList = pickle.load(open(r'd:\download\allwords.pickle', 'rb')) #a list 
combos = make_letter_combinations(3) # a list 
split = split_list_multi(combos) #2 item tuple with a dict and a number 
if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    jobs = [] 
    for num in range(split[1]): 
     listLetters = split[0][str(num)] #a list 
     thread = multiprocessing.Process(target=search_letters_in_words, args=(listLetters,wordList)) 
     jobs.append(thread) 
     thread.start() 
    for j in jobs: 
     j.join() 

Edit: Вот функция search_letters_in_words_:

def search_letters_in_words(listOfLetters,wordlist): 
    results = {} 
    for letters in listOfLetters: 
     results[letters] = [i for i in wordlist if letters in i] 
    return results 

Если кто-то может указать на то, что я делаю неправильно, я ценю это!

ответ

3

Попробуйте запустить скрипт из командной строки, а не через Wing IDE:

python scripy.py 
+0

Привет, unutbu, это фактически функция, которая отлично работает, за исключением случаев, когда я пытаюсь многопоточно переписать сценарий, что меня сбивает с толку. –

+0

Попробуйте запустить сценарий с терминала, а не изнутри WingIDE. Я не знаком с Windows (или WingIDE), но я знаю, что в Windows многопроцессорный модуль повторно импортирует скрипт для эмуляции Unix 'os.fork'. Я не уверен, что это хорошо работает внутри WingIDE. Хотя, возможно, все работает отлично. Я просто не знаю. – unutbu

+0

Кстати, похоже, что вы используете многопроцессорную систему для запуска функций в подпроцессах. Это отличается от того, что ваш скрипт многопоточен. [Нити отличаются от процессов] (http://stackoverflow.com/q/200469/190597). – unutbu

1

Я получаю код ошибки по другой причине (с Py 3 и Win 7). Чтение имени файла из файла .ini с кавычками разбило файл, открытый для функции csv.DictWriter. Снятие «" s исправлено:

... 
[CSVFILE] 
#CfgCsvNamePattern="C:\\temp\\PenSim-%%s.csv" 
CfgCsvNamePattern=C:/temp/PenSim%%s.csv 
... 
Смежные вопросы