Mac 当 运行 python 脚本来自 launchctl 时找不到 chromedriver
Mac can't find chromedriver when running python script from launchctl
我一直在尝试通过 launchctl 安排我的 python 脚本之一,但遇到了错误。目的是它在每小时的给定时间运行。
我已经创建了我的 plist,并将其加载到 launchctl 中,但它无法正常工作。做了一些挖掘后,我调试并收到以下错误消息:
追溯(最近一次通话):
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/common/service.py”,第 72 行,开始
self.process = subprocess.Popen(cmd, 环境=self.env,
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py”,第 854 行,在 init 中
self._execute_child(args, 可执行文件, preexec_fn, close_fds,
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py”,第 1702 行,在 _execute_child
提高 child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError:[Errno 2] 没有这样的文件或目录:'chromedriver'
在处理上述异常的过程中,又发生了一个异常:
回溯(最近调用最后):
文件“/Users/petersmith/Documents/Python/thenewsproject/link_getters/link_getter.py”,第 3 行,位于
导入 我的文件
文件“/Users/directories/myfile.py”,第 51 行,在
浏览器 = webdriver.Chrome('chromedriver', options=chrome_options)
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py”,第 73 行,在 init 中
self.service.start()
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/common/service.py”,第 81 行,开始
引发 WebDriverException(
selenium.common.exceptions.WebDriverException:消息:'chromedriver' 可执行文件需要在 PATH 中。请参阅 https://sites.google.com/a/chromium.org/chromedriver/home
我在粘贴时更新了粗体项目。
这是它大惊小怪的那一行:
浏览器 = webdriver.Chrome('chromedriver', options=chrome_options)
现在,chromedriver 位于我的 usr/local/bin 文件夹中,我检查了我的路径文件并看到:
-bash: /Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Applications/Xamarin: 没有那个文件或目录
你可以看到它以粗体显示,所以我有点迷路了。
有什么想法吗?
好的 - 经过大量搜索,我终于弄明白了。实际上有两件事导致我在运行时遇到问题,它们都与 launchctl 代表 用户执行工作 的方式有关。
要记住的关键是 launchctl 将代表您执行一个进程,这意味着:
- 它有自己的 PATH 变量(您需要用您的 chromedriver 位置更新),并且
- 它从它自己的工作目录执行你的脚本,而不是你的 python 脚本所在的目录。这会给你一个问题,因为你想包含的任何其他文件或你在你的文件中使用的相对路径脚本
因此,要修改 launchctl 的路径,您需要 运行 从终端执行以下命令:
launchctl setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
不记得你当时是否需要重启,但一定要卸载然后重新加载你的 plist 文件
launchctl load ~Library/LaunchAgents/your.own.plist
你应该可以开始了。
修复第二点是一个简单的键-字符串对来添加你的 plist 文件
<key>WorkingDirectory</key>
<string>/Users/you/path/to/mypythonfile/</string>
希望这对其他人有帮助!
我发现 peetysmith 的原始答案对我来说是正确的。但是,他们提供的用于更新 Launchd 中的 PATH 变量的终端命令对我不起作用(我使用的是 High Sierra)。
我发现以下方法有效:
sudo launchctl config user path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
之后您需要重新启动,无需重新加载 plist 文件(除非您对其进行了编辑)。
我一直在尝试通过 launchctl 安排我的 python 脚本之一,但遇到了错误。目的是它在每小时的给定时间运行。
我已经创建了我的 plist,并将其加载到 launchctl 中,但它无法正常工作。做了一些挖掘后,我调试并收到以下错误消息: 追溯(最近一次通话): 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/common/service.py”,第 72 行,开始 self.process = subprocess.Popen(cmd, 环境=self.env, 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py”,第 854 行,在 init 中 self._execute_child(args, 可执行文件, preexec_fn, close_fds, 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py”,第 1702 行,在 _execute_child 提高 child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError:[Errno 2] 没有这样的文件或目录:'chromedriver'
在处理上述异常的过程中,又发生了一个异常:
回溯(最近调用最后):
文件“/Users/petersmith/Documents/Python/thenewsproject/link_getters/link_getter.py”,第 3 行,位于
导入 我的文件
文件“/Users/directories/myfile.py”,第 51 行,在
浏览器 = webdriver.Chrome('chromedriver', options=chrome_options)
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py”,第 73 行,在 init 中
self.service.start()
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/common/service.py”,第 81 行,开始
引发 WebDriverException(
selenium.common.exceptions.WebDriverException:消息:'chromedriver' 可执行文件需要在 PATH 中。请参阅 https://sites.google.com/a/chromium.org/chromedriver/home
我在粘贴时更新了粗体项目。
这是它大惊小怪的那一行: 浏览器 = webdriver.Chrome('chromedriver', options=chrome_options)
现在,chromedriver 位于我的 usr/local/bin 文件夹中,我检查了我的路径文件并看到: -bash: /Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Applications/Xamarin: 没有那个文件或目录
你可以看到它以粗体显示,所以我有点迷路了。
有什么想法吗?
好的 - 经过大量搜索,我终于弄明白了。实际上有两件事导致我在运行时遇到问题,它们都与 launchctl 代表 用户执行工作 的方式有关。
要记住的关键是 launchctl 将代表您执行一个进程,这意味着:
- 它有自己的 PATH 变量(您需要用您的 chromedriver 位置更新),并且
- 它从它自己的工作目录执行你的脚本,而不是你的 python 脚本所在的目录。这会给你一个问题,因为你想包含的任何其他文件或你在你的文件中使用的相对路径脚本
因此,要修改 launchctl 的路径,您需要 运行 从终端执行以下命令:
launchctl setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
不记得你当时是否需要重启,但一定要卸载然后重新加载你的 plist 文件
launchctl load ~Library/LaunchAgents/your.own.plist
你应该可以开始了。
修复第二点是一个简单的键-字符串对来添加你的 plist 文件
<key>WorkingDirectory</key>
<string>/Users/you/path/to/mypythonfile/</string>
希望这对其他人有帮助!
我发现 peetysmith 的原始答案对我来说是正确的。但是,他们提供的用于更新 Launchd 中的 PATH 变量的终端命令对我不起作用(我使用的是 High Sierra)。
我发现以下方法有效:
sudo launchctl config user path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
之后您需要重新启动,无需重新加载 plist 文件(除非您对其进行了编辑)。