setup.py与安装Python项目

4 投票
1 回答
6702 浏览
提问于 2025-04-17 12:32

我查看了setup.py的文档,但还是遇到了一些我觉得应该很简单的问题。

我把这个问题简化成一个简单的示例项目,我的项目目录结构如下:

myproject
  setup.py
  src\
    main.py
      extern\
      __init__.py
      mytest.py

myproject/setup.py:

#!/usr/bin/env python
from distutils.core import setup

setup(name = "myproject",
      package_dir = {'':"src"},
      packages = ["extern"],
      scripts = ["src/main.py"],
      )

myproject/src/main.py:

#! /usr/bin/env python
import extern.mytest as mytest

mytest.print_test()

myproject/src/extern/mytest.py:

#!/usr/bin/env python
def print_test():
    print "YAY"

myproject/src/extern/_init_.py是空的。

我运行setup.py的方式是:

setup.py install --prefix ~/local

setup.py运行完没有错误,并把main.py移动到了~/local/bin,但当我运行它时却出现了以下错误:

ImportError: No module named extern.mytest

你知道我哪里出错了吗?谢谢!

1 个回答

9

问题在于这个模块不在 sys.path 里面,所以用 import 语句时找不到它。

在我的情况下,extern 模块安装在 ~/local/lib/python2.7/site-packages/extern 这个地方。不过,要注意的是,安装路径在安装时是随便设置成 ~/local 的。

要解决这个问题,你可以把 PYTHONPATH 变量设置成模块安装的地方,或者在 main.py 里把这个路径加到 sys.path 里面。

另外,不要用:

setup.py install --prefix ~/local

而是用:

setup.py install --user

这样做会把模块安装到你的用户站点包目录里(在我的系统上是 ~/.local),这样 Python 就能顺利找到这个包了。不过,你可能还需要把你的 PATH 环境变量改一下,加入 ~/.local/bin

撰写回答