我有一个包装器脚本,它在子进程中运行其他五个脚本,并为每个子脚本传递一个 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.....
你的例子一定不完整。
如果你:
您会发现
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()
继承了相同的环境 - 我们只能得出结论,您没有共享足够的代码来重现该问题。我建议在这里采用我的最小示例,并添加代码中的元素来重现问题,并在您的问题中分享生成的最小示例,以允许其他人帮助解决您的实际问题。