【问题标题】:Module gets imported under a syntactically false name space?模块在语法错误的名称空间下导入?
【发布时间】:2020-03-24 16:28:13
【问题描述】:

我正在关注 O'Riley Head First Python(第 2 版)课程。 在某一时刻,您将创建一个 webapp 并将其部署到 pythonanywhere(第 5 章)。

webapp 使用两个函数,从之前创建的模块导入。

该模块名为 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

的文件

然后文件被上传到 pythonanywhere 并通过控制台安装: 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

现在当我尝试运行我的 web 应用程序时,我收到以下错误:

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”而不会出现合成错误?

【问题讨论】:

    标签: python module setuptools pythonanywhere


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 2016-05-22
        • 2020-06-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        相关资源
        最近更新 更多