- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试读取“pipenv install”(pipenv==2018.11.26,Python 3.6.0)命令的输出,该命令在生成输出时通过 subprocess.Popen
运行,即不是在整个过程结束时,因为根据必须下载的数据量、连接速度等,可能需要很长时间。
我正在打印所有 stdout 和 stderr 消息并为它们添加前缀,但我仍然无法理解这种“微调器”消息:“[==] 正在创建虚拟环境...”来自何处.
这是我正在运行的完整代码
import subprocess
import threading
cmd = ['pipenv', 'install','--ignore-pipfile']
cwd = 'test'
def run_cmd(cmd,cwd):
popen = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,bufsize=1)
a = threading.Thread(target=printTh,args=("stdout",iter(popen.stdout.readline, b"")))
a.start()
b = threading.Thread(target=printTh,args=("stderr",iter(popen.stderr.readline, b"")))
b.start()
while popen.poll() is not None:
a.join()
b.join()
def printTh(pipe_name,iter):
for line in iter:
print(pipe_name+"->"+line.rstrip().decode("utf-8"), end = "\r\n",flush =True)
run_cmd(cmd,cwd)
在我的 gui 控制台上,我可以看到除了微调器“[===] Creating virtual environment..
”之外的所有内容都有一个前缀,该消息既不属于 stderr 也不属于 stdout:
控制台打印:
stderr->Creating a virtualenv for this project…
stderr->Pipfile: C:\Users\ahadu\test\Pipfile
stderr->Using C:/Program Files (x86)/Anaconda3/python.exe (3.6.0) to create virtualenv…
[ ===] Creating virtual environment...Running virtualenv with interpreter C:/Program Files (x86)/Anaconda3/python.exe
stderr->Already using interpreter C:\Program Files (x86)\Anaconda3\python.exe
stderr->Using base prefix 'C:\\Program Files (x86)\\Anaconda3'
stderr-> No LICENSE.txt / LICENSE found in source
stderr->New python executable in C:\Users\ahadu\test\.venv\Scripts\python.exe
stderr->Installing setuptools, pip, wheel...
stderr->done.
stderr->
stderr-Successfully created virtual environment!
stderr->Virtualenv location: C:\Users\ahadu\test\.venv
stdout->Installing dependencies from Pipfile.lock (d34422)…
stdout->To activate this project's virtualenv, run pipenv shell.
stdout->Alternatively, run a command inside the virtualenv with pipenv run.
Process finished with exit code 0
这条消息是从哪里来的?这也是可能需要一些时间的地方,因此在生成此消息时无法阅读它会破坏整个工作。
换句话说,我期望在控制台上看到以下打印:
some-source->[= ] Creating virtual environment...
some-source->[ =] Creating virtual environment...
some-source->[= ] Creating virtual environment...
some-source->[ =] Creating virtual environment...
直到它完成。
有谁知道这个问题的原因以及如何解决?
最佳答案
我相信这是因为,对于那些微调输出,pipenv 在写入下一行之前将流 (stdout/stderr) 重置回行首。因此,您的前缀被清除。
最初我以为你只需要设置 PIPENV_NOSPIN
和 PIPENV_HIDE_EMOJIS
运行脚本之前的环境变量。虽然这会禁用微调器和表情符号,但某些行仍然没有前缀。 (此外,您不会看到任何需要时间的操作的进展):
temp$ export PIPENV_NOSPIN=1
temp$ export PIPENV_HIDE_EMOJIS=1
temp$ python3.8 test.py
...
stderr>>>>>Pipfile.lock not found, creating...
stderr>>>>>Locking [dev-packages] dependencies...
stderr>>>>>Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
Success!>>>
stderr>>>>>Updated Pipfile.lock (49bf85)!
stdout>>>>>Installing dependencies from Pipfile.lock (49bf85)...
stdout>>>>>To activate this project's virtualenv, run pipenv shell.
stdout>>>>>Alternatively, run a command inside the virtualenv with pipenv run.
如果我们按照“解决依赖关系...”日志到 venv_resolve_deps
function in utils.py , 然后按照 write
method in spin.py ,我们会看到这样的几行:
stdout.write(decode_output(u"\r", target_stream=stdout))
现在编写 "\r"
可能会导致这样的结果:
>>> print('abc\rdef')
def
清除先前输出的位置。由于您的前缀在开头,因此也会被清除。请注意,我在这里可能错了,这就是原因,无法真正理解这些行是如何打印出来的,但这是我能找到/想到的唯一解释。
现在,我已经通过简单地将 text=True
传递给 Popen
来让您的脚本正常工作。调用,这意味着:
stdin, stdout and stderr will be opened in text mode using the encoding and errors specified in the call or the defaults for io.TextIOWrapper
def run_cmd(cmd, cwd):
popen = subprocess.Popen(
cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1,
text=True) # <==== add param here
a = threading.Thread(
target=printTh,
args=("stdout", iter(popen.stdout.readline, ""))) # <===== remove 'b'
a.start()
b = threading.Thread(
target=printTh,
args=("stderr", iter(popen.stderr.readline, ""))) # <===== remove 'b'
b.start()
while popen.poll() is not None:
a.join()
b.join()
def printTh(pipe_name, iter):
for line in iter:
# =================== remove .decode ==============
print(pipe_name + ">>>>>" + line.rstrip(), end="\r\n", flush=True)
run_cmd(cmd, cwd)
结果似乎是你想要的:
stderr>>>>>⠋ Creating virtual environment...
stderr>>>>>⠙ Creating virtual environment...
stderr>>>>>⠹ Creating virtual environment...
stderr>>>>>⠸ Creating virtual environment...
stderr>>>>>⠼ Creating virtual environment...
...
stderr>>>>>
stderr>>>>✔ Successfully created virtual environment!
stderr>>>>>Virtualenv location: /Users/me/.venvs/temp-9JdZcEvf
stderr>>>>>Creating a Pipfile for this project...
stdout>>>>>Installing flask...
stderr>>>>>
stderr>>>>>⠋ Installing...
stderr>>>>>⠙ Installing flask...
stderr>>>>>⠹ Installing flask...
stderr>>>>>⠋ Installing flask...
stderr>>>>>⠙ Installing flask...
stderr>>>>>⠹ Installing flask...
stderr>>>>>⠸ Installing flask...
stderr>>>>>⠼ Installing flask...
stderr>>>>>Adding flask to Pipfile's [packages]...
stderr>>>>✔ Installation Succeeded
stderr>>>>>Pipfile.lock not found, creating...
stderr>>>>>Locking [dev-packages] dependencies...
stderr>>>>>Locking [packages] dependencies...
stderr>>>>>
stderr>>>>>⠋ Locking...
stderr>>>>>Building requirements...
stderr>>>>>
stderr>>>>>Resolving dependencies...
stderr>>>>>
stderr>>>>>⠙ Locking...
stderr>>>>>⠹ Locking...
stderr>>>>>⠸ Locking...
stderr>>>>>⠙ Locking...
stderr>>>>>⠦ Locking...
stderr>>>>>⠧ Locking...
stderr>>>>>⠇ Locking..✔ Success!
stderr>>>>>Updated Pipfile.lock (9536c4)!
stdout>>>>>Installing dependencies from Pipfile.lock (9536c4)...
stdout>>>>>To activate this project's virtualenv, run pipenv shell.
stdout>>>>>Alternatively, run a command inside the virtualenv with pipenv run.
测试:
关于python - 如何使用子进程拦截 "pipenv install"类似微调器的输出消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63342602/
Pipfile.lock 中的哈希有什么用? 我做什么 我用 pipenv 创建了一个 Pipfile + Pipfile.lock 我将它们复制到一个新位置 我更改哈希值(例如,将第一个字符替换为“
我正在学习Python虚拟环境。在我运行的一个小项目中 pipenv run python myproject.py 它在C:\Users\USERNAME\.virtualenvs中为我创建了一个v
管道: 我在https://realpython.com/pipenv-guide/找到为了将项目转移到开发中,我必须运行 pipenv lock (更新/创建 Pipfile.lock 文件) 根据
我使用的是 pipelinev 版本“2018.7.1”以及 pip 18.0。 我有一个Pipfile并运行pipenv install 。 它失败了: Could not find a versi
我正在使用 Python 3.8.1: $ python -V Python 3.8.1 我已经安装了 pipenv: $ pip list | grep pipenv pipenv
我有一个在 PyCharm 中使用 Pipenv 的 Python 项目,我已将其删除,现在当我尝试在同一位置创建一个新项目时,出现以下错误: Pipenv interpreter has alrea
我正在 VSCode Bash 终端上设置 pipenv 虚拟环境,但没有显示 (pipenv) ,这使它非常困惑。 当我使用Pycharm并让它配置pipenv环境时,它会自动显示(pipenv)在
WARNING: The scripts pipenv and pipenv-resolver are installed in '/Library/Frameworks/Python.framewo
有两个包提供了名为 jsonfield 的模块: django-jsonfield jsonfield 不幸的是,我们有依赖于这两个包的依赖项,这两个包虽然可以互换,但以不同的方式将数据存储到数据库中
鉴于 Pipfile 存在,似乎两者都会从 Pipfile 安装所有依赖项,并更新 Pipfile.lock。那么,有什么区别呢? 最佳答案 pipenv lock 从 Pipfile 生成一组一致的
Pipenv 已安装,我可以运行 $ pipenv --version pipenv, version 2018.11.26 但是,如果在 VSCode 中打开一个包含 Pipfile 的项目文件夹,
我正在使用 pipenv 来管理我的 python 包,在我的存储库中,我有 Pipfile 和 Pipfile.lock 版本。我想在我的实时服务器上安装所有 python 包。我应该使用 pipe
pipenv install命令引用 here . -i, --index Target PyPI-compatible package index url. --pypi-mirror Specif
我是 python 和 pipenv 的新手。当我运行 pipenv lock 时,出现以下错误,我重新安装了 pipenv 并在 google 上搜索错误,但仍然无法修复错误。上次用pipenv打开
如果有人不小心使用 pip install而不是 pipenv install在 pipenv 环境中,该包不会反射(reflect)在 Pipfile 上的包列表中,也不会反射(reflect)在
我正在尝试使用 pipenv 从 Pipfile 安装包,但我一直收到错误,我不知道如何调试。 pip --version pip 18.1 pipenv --version version 2018
我通过 Pharo/GToolkit 的 PythonBridge 使用 Python ,它在底层使用了 pipenv。 事情是通过这个内置的 PythonBridge 脚本 (install_env
所以这个错误发生在我为较新的 Python 3.8.3 卸载 Python 3.7.4 之后。我尝试使用 pipenv install,这是它的输出: PS C:\Users\enoch\Docume
我想在 pipenv 中为面部识别应用程序安装以下软件包。几乎所有这些软件包的安装过程都失败了。 唯一正确安装的软件包是 opencv-python 和 numpy cmake 人脸识别 NumPy
由于某种原因,我在使用最近才开始使用的 Pipenv 时遇到问题。似乎始终如一,每当我尝试使用 pipenv install 从 Pipfile 创建/安装虚拟环境时,我都会收到 Locking Fa
我是一名优秀的程序员,十分优秀!