【问题标题】:ImportError: No module named htmlcreator even though it is installedImportError:即使已安装,也没有名为 htmlcreator 的模块
【发布时间】:2020-05-20 20:25:23
【问题描述】:

下面的 Python 脚本 (testbov.py) 从小说《包法利夫人》中提取一个句子。

'''

#!/usr/bin/env python       
from random import randint
import io
import codecs
from htmlcreator import HTMLDocument
import webbrowser

with codecs.open('./bovary_sc_no_susp.txt', 'r', encoding='utf8', errors='ignore') as source: 
    data=source.read() 
    splot_data=data.split(".") 
    has = randint(0,len(splot_data)) 
    prise = splot_data[has] 

document = HTMLDocument()
document.set_title('a slice of Bovary')
document.add_header('The slice')
document.add_text(prise)
document.write('my_document.html')  
webbrowser.open('./my_document.html')

'''

通过以下命令“python testbov.py”从它所在的目录(/var/www/html/test/cgi-bin)运行脚本时,它会执行他必须做的事情,并以浏览器页面。 (Python是miniconda安装的python 3.7)

当使用运行按钮从 Geany 启动脚本时,它会打开一个终端并显示以下错误消息:

Traceback (most recent call last):
  File "testbov .py", line 7, in <module>
    from htmlcreator import HTMLDocument
ImportError: No module named htmlcreator

------------------
(program exited with code: 1)
Press return to continue

当通过指向localhost/test的浏览器调用脚本时,test目录下的index.html如下:

<html><head><title>minimal page</title></head>
<form action="http://localhost/test/cgi-bin/testbov.py" />
<input type="submit" value="Go !" />
</form></html>

我在 /var/log/apache2/error.log 中收到错误 500 和以下消息:

Traceback (most recent call last):
  File "/var/www/html/test/cgi-bin/testbov.py", line 7, in <module>
    from htmlcreator import HTMLDocument
ImportError: No module named htmlcreator

看来浏览器和 geany 都无法找到 htmlcreator(通过 pip 安装),而终端却可以找到。

【问题讨论】:

    标签: python apache2 python-module geany


    【解决方案1】:

    正确的导入是

    from html_creator import Document
    

    【讨论】:

      【解决方案2】:

      我相信它在自己的虚拟环境中运行。您需要在该虚拟环境中安装模块。 您可以在脚本中检查它。 Determine if Python is running inside virtualenv

      import sys
      
      def is_venv():
          return (hasattr(sys, 'real_prefix') or
                  (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
      
      if is_venv():
          print('inside virtualenv or venv')
      else:
          print('outside virtualenv or venv')
      

      【讨论】:

        【解决方案3】:

        请添加这个小调试代码:

        import os
        print(os.environ['_'])
        

        在脚本的开头验证在这两种情况下使用哪个 python 来执行脚本。

        然后确保它们完全相同或htmlcreator 在两种环境中都可用。

        【讨论】: