Python 脚本单独运行(从 cmd),但不在子进程中运行:有关请求模块的错误

问题描述 投票:0回答:1

我有一个包装器脚本,它在子进程中运行其他五个脚本,并为每个子脚本传递一个 config_file 。第一个和最后两个脚本运行没有问题,但中间的脚本引起了问题。我设置了一个包含所有依赖项的虚拟环境,包括请求模块。在中间的脚本中,我使用 requests 模块来调用 API。

当我从命令提示符将 config_file 传递给它时,这个中间脚本工作得很好,但是当我将它作为包装器的一部分运行时,它会给出一个错误并显示

Traceback (most recent call last):
  File "Leis.py", line 2, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

我已停用并删除我的环境,重新设置它,确认我在那里有请求。从包装器运行时,我似乎无法进入主函数内部,但它本身就可以很好地工作。请帮忙!

包装代码:

for script in config["scripts"]:
        script_name = os.path.basename(script)
        logging.info(f"Running {script_name}")
        sp.run(["python", script, config_file], 
               stdout=sp.PIPE, stderr=sp.PIPE, 
               text=True, check=True, bufsize=1)
    logging.info(f".....")

leis.py代码:

import requests
import sys
import os
import logging
from utils import setup_logging, load_config, check_files_exist
 

def get_registration(lei):
    try:
        url = f".........."
        payload = {}
        headers = {'Accept': 'application/vnd.api+json'}
        response = requests.request("GET", url, headers=headers, data=payload)
        json = response.json()
        if not json:
            return [None, None]
        registered_at_id = json.....
  • 删除并重新创建虚拟环境(以确保“请求”安装)
  • 独立运行脚本(工作)
python-3.x python-requests subprocess virtualenv modulenotfounderror
1个回答
0
投票

你的例子一定不完整。

如果你:

  • 创建虚拟环境
  • 激活它
  • 使用以下内容创建两个脚本“main.py”和“work.py”
  • 从活动环境中执行“main.py”

您会发现

work.py
(导入并使用
requests
)可以正常工作。

main.py
的内容:

from subprocess import run, PIPE

p = run(["python", "work.py"], stdout=PIPE, stderr=PIPE, text=True, check=True, bufsize=1)
print(p.stdout)

work.py

import requests

response = requests.get('https://stackoverflow.com')
print(response.status_code)

从环境中运行

python main.py
,输出为:

200

请注意,

run
命令使用与您的调用相同的参数。配置文件已被保留,但无论如何这只是不相关的东西 - 除非您根据未共享的配置从未共享的代码中搞乱了您的环境。

鉴于此操作没有问题 - 正如它应该的那样,因为

subprocess.run()
继承了相同的环境 - 我们只能得出结论,您没有共享足够的代码来重现该问题。我建议在这里采用我的最小示例,并添加代码中的元素来重现问题,并在您的问题中分享生成的最小示例,以允许其他人帮助解决您的实际问题。

© www.soinside.com 2019 - 2024. All rights reserved.