2013-01-19 135 views
7

比方说,你有一个项目叫proj在这个项目中,你有以下结构:setup.py:重命名SRC包项目名称

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

正如你可以看到所有的内容的项目是src子文件夹。如何从src文件夹中制作distutils分发包?

我天真的想法,以下the tutorial,会一直写setup.py这样的:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

但安装所产生的包我的系统之后,我还是不得不进口src.xyz,而不是proj.xyz,这会是目标和预期的结果。

回答

-3

你可以尝试添加src文件夹到PYTHONPATH调用setup函数之前:

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

而且也只是为了安全起见,你再更改工作目录:

os.chdir(src_path) 

之后,它应该都可以。

其他用于打包应用程序的工具支持从内部。我认为这是setuptools,原来是PyInstaller。但基本上,这就是应该做的,就足以让你的包直接导入。

结果distutils有package_dir指令。这就是你应该使用的,但它可能工作只需将您的包添加到PYTHONPATH

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

和更改setup.py到:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

它不是由distutils的要求,但其他工具所期望的父目录

+1

我不知道你得到了这个问题。我试图编写一个Python包,其他人可以轻松地自行安装。这不仅仅是导入你在另一个文件夹中写入的内容。 – erikbwork

+0

是的,我明白了,但是'setup.py'必须在另一个文件夹中导入内容才能工作。一旦这些软件包在你的PYTHONPATH中,它们在哪里并不重要。如果它不适合你,你将不得不看另一种方式,对不起。 – jadkik94

+0

对不起,但这不是问题。 – erikbwork

4

你可以通过把Python包文件到proj/目录修复在这种情况下__init__.py文件的名称与Python包名称相同,即proj

+0

我做到了,它的工作原理。不知道我是否理解你最后的评论。你的意思是有些工具希望我有像proj/src/proj这样的文件夹结构来按预期工作?似乎如此低效。或者我在这里做的东西效率低下? – erikbwork

+0

我的意思是,目录名:'/__初始化__ py'应该是一样的Python包的名称,即如果我看到'__init __ py'那么只要看看它的父目录的名字我知道Python包,它是。 – jfs

2

这是因为在这里报道setuptools的错误:https://github.com/pypa/setuptools/issues/250

基本上,它的工作,而不是在开发模式。现在,你有3个解决方案:

  • 符号链接src包作为proj(和comitting时忽略它),它会开箱的,但脏
  • 变化从srcproj
  • 创建子目录projsrc和使用以下选项:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

链接到setuptools问题:https://github.com/pypa/setuptools/issues/250 –

+0

问题已关闭3.5+ – Daniel