【问题标题】:How to execute python scripts that import third party modules via the command line如何通过命令行执行导入第三方模块的python脚本
【发布时间】:2021-06-04 02:04:37
【问题描述】:

我有一个 py 文件,它使用传递给它的系统参数执行 google 搜索,并将搜索的前五个结果作为单独的浏览器选项卡打开(这是 Automate the Boring Stuff 书中的一个练习)。

我想通过 Windows 运行命令执行此脚本,因此创建了一个 BAT 文件。

目前,当我执行BAT文件时,返回“找不到模块”错误。

我怀疑这个问题与py文件所需的模块仅安装在我的特定python项目的虚拟环境中有关(我有一个专门用于本书练习的项目)。因此,我将必要的模块直接安装到了我的主要 Python 安装环境中。不幸的是,这没有效果。

然后我通过在执行我的 py 文件的行之前添加一行来激活我的虚拟环境来修改我的 BAT 文件。这似乎阻止了我的 py 文件被 BAT 文件执行。

我对 Python 有点熟悉,但对 BAT 文件和一般命令行比较陌生。我已经阅读了一个基本的命令行教程,但找不到任何有用的东西。

我不确定如何解决这个问题,如果可能的话,我希望避免使用大量模块污染我的主要 python 环境。这可能吗?如果可以,我错过了什么?

.bat 文件

@py.exe C:\Users\Betty\PycharmProjects\Automate_the_Boring_Stuff\12\searchpypi.py %*
@pause

.py 文件

#! python3
# searchpypi.py  - Opens several search results.


import sys
import webbrowser

import requests

import bs4

print('Searching...')    # display text while downloading the search result page
res = requests.get('https://google.com/search?q=' 'https://pypi.org/search/?q='
                   + ' '.join(sys.argv[1:]))
res.raise_for_status()

# Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# Open a browser tab for each result.
linkElems = soup.select('.package-snippet')
numOpen = min(5, len(linkElems))

# Open a browser tab for each result.
for i in range(numOpen):
    urlToOpen = 'https://pypi.org' + linkElems[i].get('href')
    print('Opening', urlToOpen)
    webbrowser.open(urlToOpen)

编辑(UTC 时间 2021 年 3 月 5 日星期五 16:41:27):

错误信息(从命令行复制):

Traceback (most recent call last):
  File "C:\Users\Betty\PycharmProjects\Automate_the_Boring_Stuff\12\searchpypi.py", line 8, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'
Press any key to continue . . .

编辑(2021 年 3 月 6 日星期六 07:39:43 UTC):

点子详情:

C:\Users\Betty>pip -V
pip 21.0.1 from c:\python38\lib\site-packages\pip (python 3.8)

C:\Users\Betty>pip3 list
Package          Version
---------------- ----------
appdirs          1.4.4
certifi          2020.12.5
chardet          4.0.0
distlib          0.3.1
filelock         3.0.12
idna             2.10
pip              21.0.1
pipenv           2020.11.15
requests         2.25.1
setuptools       41.2.0
six              1.15.0
urllib3          1.26.3
virtualenv       20.2.2
virtualenv-clone 0.5.4
wheel            0.34.2

C:\Users\Betty>

【问题讨论】:

  • 你能检查一下你正在使用的 pip 版本吗?然后查看 pip3 list 的输出?

标签: python batch-file pip command-line-arguments


【解决方案1】:

自动化一切意味着:

  • 为此 Python 脚本创建虚拟环境
  • 采购
  • 安装依赖项
  • 运行脚本
  • 可选(必要时进行清理)

有一种方法可以在 Bash 上执行此操作,但我不确定这是否适用于 Windows shell。

首先,您需要将所有依赖项放在 requirements.txt 文件中。每个依赖项应该在文档中占一行。

requirements.txt的内容:

webbrowser
beautifulsoup4

还有自动化script.sh

# creates a venv folder that contains a copy of python3 packages to isolate any further changes in packages from the system installation
python3 -m venv venv  
 # tell the shell to use the created virtual environment
source venv/bin/activate
# install requirements
pip3 install -r requirements.txt 
# run the script
python3 your_script_filename.py
# remove the venv
rm -rf venv
# deactivate the virtual environment
deactivate

这是一个非常基本的脚本,类似于手动调用 Python 脚本。有很大的改进空间。 venv 可以放在操作系统临时文件夹中,可以留在那里以备下次使用。这将消除重新创建 venv 和安装要求的需要。

我知道这不是你想要的,但我希望它能让你更进一步

【讨论】:

  • 最后删除 requirements.txt 很奇怪。你为什么要这么做?
  • 你是对的。我已经修好了。删除虚拟环境文件夹...但代价是每次都必须下载要求...
  • 感谢您的回复!我几乎可以理解为什么我需要创建一个临时 venv 来完全自动化脚本并将使用提供的脚本继续测试。如果所需的模块安装在我的主要 python 环境中,我仍然无法解释为什么 .py 脚本不会执行。对此有何想法?
  • 您能否在上述问题中分享确切的错误消息?这将有助于了解问题可能出在哪里。
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 2013-02-10
  • 2020-10-01
  • 1970-01-01
  • 2018-04-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多