2015-12-21 6 views
2

Когда setup.py указывает package_dir, отличный от имени пакета, функция nosetests. setup.py не работает из-за ImportError. Ниже приведен минимальный пример.команда setup.py nosetests бросает ImportError при указании package_dir

структура каталогов:

setup.py 
src/ 
    __init__.py 
    myclass.py 
unittests/ 
    __init__.py 
    test.py 

Файлы инициализации пусты. MyClass тривиальна:

class myclass(): 
    def __init__(): 
     a=10 

test.py просто инициализирует экземпляр MyClass:

import unittest 
import mypkg 

class Tests(unittest.TestCase): 
    def _run_test(self): 
     a = mypkg.myclass() 

а также setup.py файл выглядит следующим образом

from setuptools import setup 

setup(
    name = 'mypkg', 
    packages = ['mypkg'], 
    package_dir={'mypkg':'src'} 
    ) 

Он строит и устанавливает правильно , но до установки вы получаете:

python3.4 setup.py nosetests 
running nosetests 
running egg_info 
writing top-level names to mypkg.egg-info/top_level.txt 
writing dependency_links to mypkg.egg-info/dependency_links.txt 
writing mypkg.egg-info/PKG-INFO 
reading manifest file 'mypkg.egg-info/SOURCES.txt' 
writing manifest file 'mypkg.egg-info/SOURCES.txt' 
E 
====================================================================== 
ERROR: Failure: ImportError (No module named 'mypkg') 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
      : 
      : 
      : 
    File "<root_dir>/unittests/test.py", line 2, in <module> 
    import mypkg 
ImportError: No module named 'mypkg' 

---------------------------------------------------------------------- 
Ran 1 test in 0.026s 

FAILED (errors=1) 

Я преследовал его, и я уверен, что это происходит, потому что в setup.py я фактически переименовываю каталог с помощью package_dir. Есть ли какой-то трюк, чтобы делать носетесты без изменения моей структуры каталогов?

Примечание: это выполняется с использованием python3.4 с Setuptools версии 2.1 и nosetests версии 1.3.4

ответ

0

привет вы должны указать файл, который содержит ру мойпакет может быть:

from yourfile import mypkg 

Благодарности

+1

Это будет работать только если файлы не были перемещены в процессе установки Setuptools ... – Solter

0

Я нашел способ сделать это, хотя это не очень мило ... Но вот идет:

Один из способов убедиться в том, что носитеты действуют у вас есть доступ ко всему, что нужно построить, прежде чем вы запустите nosetests. Команда Nosetests для setuptools на самом деле сделает это, но если она может быть ленивой и пытается запустить тесты на месте, что не получается из-за магии настройки, которая перестраивает структуру пакета. Чтобы принудительно построить носеты перед выполнением, добавьте флаг

use_2to3 = True 

к команде setup.py.

Обратите внимание, что если вы НЕ хотите запускать 2to3 (скажем, у вас есть некоторые модули python2.7, вы довольны этим перерывом), это не сработает.

В конце концов, все остается неизменным, за исключением setup.py, который выглядит следующим образом:

from setuptools import setup 

setup(
    name = 'mypkg', 
    packages = ['mypkg','unittests'], 
    package_dir={'':'src'}, 
    use_2to3 = True, 
    )