Python ImportError:没有名为scrapyproject.settings的模块

Python ImportError:没有名为scrapyproject.settings的模块,python,scrapy,scrapy-spider,Python,Scrapy,Scrapy Spider,我有一个粗糙的项目,其想法是执行爬虫程序,并得到结果回来。我使用Flask作为api最终应用程序,也使用virtualenvironment from scrapy.spiderloader import SpiderLoader from scrapy.utils.project import get_project_settings @app.route("/") def hello(): settings = get_project_settings() loader =

我有一个粗糙的项目,其想法是执行爬虫程序,并得到结果回来。我使用Flask作为api最终应用程序,也使用virtualenvironment

from scrapy.spiderloader import SpiderLoader
from scrapy.utils.project import get_project_settings

@app.route("/")
def hello():
    settings = get_project_settings()
    loader = SpiderLoader(settings)
    spiders = loader.list()
    // validate spider
    cmd = "scrapy crawl test --nolog --output-format=json -o -"
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    output = proc.stdout.read()
    return Response(output, mimetype='application/json')
问题是在执行子流程时使用了下面的行

settings = get_project_settings()
loader = SpiderLoader(settings)
spiders = loader.list()
结果为空,并抛出异常

Traceback (most recent call last):
  File "/var/www/projects/ENV/bin/scrapy", line 11, in <module>
    sys.exit(execute())
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/cmdline.py", line 108, in execute
    settings = get_project_settings()
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/utils/project.py", line 60, in get_project_settings
    settings.setmodule(settings_module_path, priority='project')
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 282, in setmodule
    module = import_module(module)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named scrapyproject.settings
我还研究了一些问题/答案,其中提到了虚拟环境可能存在的问题。但我想知道为什么它只在执行某些代码时才起作用

如果你想知道为什么我没有使用/执行。我需要的是在不通过管道保存到任何文件系统或数据库或任何东西的情况下获取输出。

将环境副本传递到子流程

proc = subprocess.Popen(..., env=os.environ.copy())
当调用
get\u project\u SETTINGS()
时,
SCRAPY\u SETTINGS\u模块
的引入实际上让我大开眼界,而当运行执行
SCRAPY
的命令时,就会感觉到它被加载了。但并不是真的装了

因此,解决方案是将环境变量作为

del os.environ['SCRAPY_SETTINGS_MODULE']
在调用子流程之前

希望这能帮助别人,节省他们的时间

多谢各位

del os.environ['SCRAPY_SETTINGS_MODULE']