我有一个正在处理的 python 脚本,我正在使用 pyinstaller 打包成一个可执行文件。
在脚本中,当它未编译时,我引用了位于主脚本旁边文件夹中的一组工具,如下所示:
\parent
----->\tools\
------>db.py
------>file_utils.py
main.py
Run Code Online (Sandbox Code Playgroud)
我省略了 init,但它也在那里。在我的脚本中,我正在导入这些文件,例如
import tools.db
import tools.file_utils
Run Code Online (Sandbox Code Playgroud)
所有这些工作正常。当我使用 PyInstaller 将它打包为可执行文件时,我收到一个模块未找到工具错误。我已经尝试添加工具的绝对路径,将工具和相关文件添加到隐藏的导入,以及所有这些,但我有一种感觉,这是我在脚本中调用它们的方式。
我想所有这些帮助程序脚本都可以位于脚本旁边的父目录中,或者我可以将工具添加到 sys.path 并直接导入 db 和 fileutils,但这似乎有点笨拙和/或混乱。有什么明显的我失踪了吗?
我有一个脚本可以检查数十万个提供的网站的状态代码,并且我试图将信号量集成到流程中以加快处理速度。问题是,每当我集成信号量时,我只会得到一个填充有 None 对象的列表,而且我不完全确定为什么。
我主要是从其他来源复制代码,因为我还没有完全理解异步编程,但似乎当我调试时我应该从函数中获取结果,但当我收集结果时出现了问题。我尝试过在循环、收集、确保未来等方面进行杂耍,但似乎没有什么能返回有效的事情列表。
async def fetch(session, url):
try:
async with session.head(url, allow_redirects=True) as resp:
return url, resp.real_url, resp.status, resp.reason
except Exception as e:
return url, None, e, 'Error'
async def bound_fetch(sem, session, url):
async with sem:
await fetch(session, url)
async def run(urls):
timeout = 15
tasks = []
sem = asyncio.Semaphore(100)
conn = aiohttp.TCPConnector(limit=64, ssl=False)
async with aiohttp.ClientSession(connector=conn) as session:
for url in urls:
task = asyncio.wait_for(bound_fetch(sem, session, url), timeout)
tasks.append(task)
responses = await asyncio.gather(*tasks)
# responses = [await …Run Code Online (Sandbox Code Playgroud)