模块以语法错误的名称 space 导入?

Module gets imported under a syntactically false name space?

我正在学习 O'Riley Head First Python(第 2 版)课程。 在某一时刻,您将创建一个 Web 应用程序并将其部署到 python任何地方(第 5 章)。

Web 应用程序使用两个函数,从先前创建的模块中导入。

模块名为 vsearch.py。我还创建了一个 readme.txt 和一个 setup.py 并使用 setuptools 使用 :

创建了一个源分发文件

python3 setup.py sdist

setup.py的代码如下:

from setuptools import setup

setup(
    name = "vsearch",
    version = "1.0",
    description = "The Head First Python Seach Tools",
    author = "HF Python 2e",
    author_email = "hfpy2e@gmail.com",
    url = "headfirstlabs.com",
    py_modules = ["vsearch"],
)

源分发文件的创建没有错误,并创建了一个名为 vsearch-1.0.tar.gz

的文件

然后文件会上传到 python任何地方,并使用以下命令通过控制台安装: python3 -m pip install vsearch-1.0.tar.gz --user

控制台输出:

15:36 ~/mysite $ python3 -m pip install vsearch-1.0.tar.gz --user
Looking in links: /usr/share/pip-wheels
Processing ./vsearch-1.0.tar.gz
Building wheels for collected packages: vsearch
  Running setup.py bdist_wheel for vsearch ... done
  Stored in directory: /home/Mohr/.cache/pip/wheels/85/fd/4e/5302d6f3b92e4057d341443ed5ef0402eb04994663282c12f7
Successfully built vsearch
Installing collected packages: vsearch
  Found existing installation: vsearch 1.0
    Uninstalling vsearch-1.0:
      Successfully uninstalled vsearch-1.0
Successfully installed vsearch-1.0

现在,当我尝试 运行 我的网络应用程序时,出现以下错误:

2020-03-24 16:18:14,592: Error running WSGI application
2020-03-24 16:18:14,592: ModuleNotFoundError: No module named 'vsearch'
2020-03-24 16:18:14,593:   File "/var/www/mohr_eu_pythonanywhere_com_wsgi.py", line 16, in <module>
2020-03-24 16:18:14,593:     from vsearch4web import app as application  # noqa
2020-03-24 16:18:14,593: 
2020-03-24 16:18:14,593:   File "/home/Mohr/mysite/vsearch4web.py", line 3, in <module>
2020-03-24 16:18:14,593:     from vsearch import search4letters

从这个错误判断,我认为无法找到 "vsearch",因为它被安装为 "vsearch-1.0"。但是,当我尝试将此行更改为:

from vsearch-1.0 import search4letters

我理所当然地得到一个语法错误,因为我不能用这种方式寻址模块。那么我能做些什么呢?在开始创建模块时,我在 setup.py 文件中添加了一个版本号,因为根据讲座,这是很好的做法。 Setuptools 随后会自动创建以“-1.0”结尾的源分发文件。此外,当使用上面显示的命令导入它时,我会自动将 importet 获取为 "vsearch-1.0",而由于错误的语法,我无法在我的 python 代码中引用。

我是不是做错了什么?有没有办法在另一个命名空间下导入它?有没有办法在我的 python 代码中引用 "vsearch-1.0" 而不会出现语法错误?

pip install --user(强调--user)将软件包安装到您的用户目录:/home/Mohr/.local/lib/pythonX.Y/site-packages/.

对于 运行 您的 WSGI 应用程序,您可能使用了用户安装的模块不可用的虚拟环境。要在 venv 中使用模块,您必须在 venv 中安装所有内容。因此,在终端中激活 venv 并使用 venv 的 pip:

安装模块
pip install vsearch-1.0.tar.gz

PythonAnywhere 上安装了不同的 python3 版本。当您使用 python3 -m pippip3 安装某些东西时,您使用的默认 python3 可能与您的网络应用程序的 python 版本设置不匹配。使用 python3.7pip3.7python3.6pip3.6 等以确保 --user 安装。