如何构建多个兼容Python 2.7+和3.3 +兼容名称的python模块?
让我们调用命名空间test
。现在我想要两个名为test.foo
的单独模块和另一个名为test.bar
的模块。但是,我目前正在开发test.helloworld
,这取决于test.foo
和test.bar
。两者都列在requirements.txt
文件中。
模块test.foo
和test.bar
当前正在使用Python 2 solution命名空间包:
import pkg_resources
pkg_resources.declare_namespace(__name__)
在导入pip install -e .
或ImportError: No module named 'test.helloworld'
时,suggested pip-command for development mode test.foo
转为:test.bar
正在运行。
命名空间包的Python 3 solution是隐式命名空间包,其中命名空间包没有__init__.py
文件。遗憾的是,这不适用于Python 2版本。
如何为Python 2和3设计解决方案(允许我使用pip install -e .
)? --egg
解决方案对我不起作用,因为它已被弃用。
答案 0 :(得分:1)
I recently had a similar issue, where I had to install a package for Python 2 and 3. I ended up having to download the code from GitHub, then ran the setup.py by calling
var pos = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
and
#include <stdio.h>
#define N 50
struct alumno
{
char nombre [N];
char apellido [N];
float nota1;
float nota2;
float nota3;
float nota4;
} alumno1, alumno2, alumno3;
struct notas
{
float prom;
float nmax;
float nmin;
} notas1, notas2, notas3;
float promedio (struct alumno a, struct notas b)
{
b.prom = (a.nota1 + a.nota2 + a.nota3 + a.nota4)/4;
return b.prom;
};
float notamaxima (struct alumno a, struct notas b)
{
if ((a.nota1>a.nota2) && (a.nota1>a.nota3) && (a.nota4>a.nota4))
{
b.nmax=a.nota1;
}
else if ((a.nota2>a.nota1) && (a.nota2>a.nota3) &&
(a.nota2>a.nota4))
{
b.nmax=a.nota2;
}
else if ((a.nota3>a.nota1) && (a.nota3>a.nota2) &&
(a.nota3>a.nota4))
{
b.nmax=a.nota3;
}
else if ((a.nota4>a.nota1) && (a.nota4>a.nota2) &&
(a.nota4>a.nota3))
{
b.nmax=a.nota4;
}
return 0;
};
float notaminima (struct alumno a, struct notas b)
{
if ((a.nota1<a.nota2) && (a.nota1<a.nota3) && (a.nota1<a.nota4))
{
b.nmin=a.nota1;
}
else if ((a.nota2<a.nota1) && (a.nota2<a.nota3) &&
(a.nota2<a.nota4))
{
b.nmin=a.nota2;
}
else if ((a.nota3<a.nota1) && (a.nota3<a.nota2) &&
(a.nota3<a.nota4))
{
b.nmin=a.nota3;
}
else if ((a.nota4<a.nota1) && (a.nota4<a.nota2) &&
(a.nota4<a.nota3))
{
b.nmin=a.nota4;
}
return 0;
};
int main ()
{
struct alumno;
struct notas;
printf ("Ingrese nombre del alumno:\n");
fgets (alumno1.nombre, N, stdin);
printf ("Ingrese apellido del alumno:\n");
fgets (alumno1.apellido, N, stdin);
printf ("Ingrese la primera nota del alumno:\n");
scanf ("%f", &alumno1.nota1);
printf ("Ingrese la segunda nota del alumno:\n");
scanf ("%f", &alumno1.nota2);
printf ("Ingrese la tercera nota del alumno:\n");
scanf ("%f", &alumno1.nota3);
printf ("Ingrese la cuarta nota del alumno:\n");
scanf ("%f", &alumno1.nota4);
promedio (alumno1, notas1);
notamaxima (alumno1, notas1);
notaminima (alumno1, notas1);
printf ("El promedio del primer alumno es %f\n", notas1.prom);
printf ("La nota maxima del primer alumno es %f\n", notas1.nmax);
printf ("La nota minima del primer alumno es %f\n", notas1.nmin);
printf ("Ingrese nombre del alumno:\n");
fgets (alumno1.nombre, N, stdin);
printf ("Ingrese apellido del alumno:\n");
fgets (alumno1.apellido, N, stdin);
printf ("Ingrese la primera nota del alumno:\n");
scanf ("%f", &alumno2.nota1);
printf ("Ingrese la segunda nota del alumno:\n");
scanf ("%f", &alumno2.nota2);
printf ("Ingrese la tercera nota del alumno:\n");
scanf ("%f", &alumno2.nota3);
printf ("Ingrese la cuarta nota del alumno:\n");
scanf ("%f", &alumno2.nota4);
promedio (alumno2, notas2);
notamaxima (alumno2, notas2);
notaminima (alumno2, notas2);
printf ("El promedio del segundo alumno es %f\n", notas2.prom);
printf ("La nota maxima del segundo alumno es %f\n", notas2.nmax);
printf ("La nota minima del segundo alumno es %f\n", notas2.nmin);
printf ("Ingrese nombre del alumno:\n");
fgets (alumno1.nombre, N, stdin);
printf ("Ingrese apellido del alumno:\n");
fgets (alumno1.apellido, N, stdin);
printf ("Ingrese la primera nota del alumno:\n");
scanf ("%f", &alumno3.nota1);
printf ("Ingrese la segunda nota del alumno:\n");
scanf ("%f", &alumno3.nota2);
printf ("Ingrese la tercera nota del alumno:\n");
scanf ("%f", &alumno3.nota3);
printf ("Ingrese la cuarta nota del alumno:\n");
scanf ("%f", &alumno3.nota4);
promedio (alumno3, notas3);
notamaxima (alumno3, notas3);
notaminima (alumno3, notas3);
printf ("El promedio del tercer alumno es %f\n", notas3.prom);
printf ("La nota maxima del tercer alumno es %f\n", notas3.nmax);
printf ("La nota minima del tercer alumno es %f\n", notas3.nmin);
return 0;
}
This results in the package being installed for both Python 2 and 3, even though the code itself was meant for Python 2. This allows me to work with the package whether I use Python 2 or 3, without any namespace conflicts.
答案 1 :(得分:1)
您想要使用pkgutil样式的命名空间包。
来自https://packaging.python.org/guides/packaging-namespace-packages/:
pkgutil-style命名空间包
Python 2.3引入了pkgutil模块和extend_path函数。这可用于声明需要与Python 2.3+和Python 3兼容的命名空间包。这是建议的最高级别兼容性方法。
一个表格列出了处理命名空间包的所有可能方法,以及哪些方法可以协同工作:https://github.com/pypa/sample-namespace-packages/blob/master/table.md
答案 2 :(得分:0)
请参阅similar question上的答案,了解有关python 2和3的完整说明。
简而言之,setup.py
除了namespace_packages
之外,每个模块还需要唯一名称和通用 __init__.py
定义声明命名空间设置为namespace_packages
。
如果您仍然遇到问题,请为每个模块发布setup.py
和__init__.py
。