我在设置环境两天后跟踪此张量流tutorial我终于可以使用cmd运行premade_estimator.py
但是当我尝试在jupyter笔记本中运行相同的代码时,我收到此错误:
usage: ipykernel_launcher.py [-h] [--batch_size BATCH_SIZE] [--train_steps TRAIN_STEPS] ipykernel_launcher.py: error: unrecognized arguments: -f C:\Users\david\AppData\Roaming\jupyter\runtime\kernel-4faecb24-6e87-40b4-bf15-5d24520d7130.json
发生了异常,使用%tb查看完整的回溯。
SystemExit: 2 C:\Anaconda3\envs\python3x\lib\site-packages\IPython\core\interactiveshell.py:2918: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
我尝试使用以下方法修复它:
pip install --ignore-installed --upgrade jupyter
pip install ipykernel
python -m ipykernel install
conda install notebook ipykernel
ipython kernelspec install-self
任何想法都会欣赏!谢谢!
答案 0 :(得分:12)
我明白了!我们得到错误的原因是因为此代码使用argparse
并且此模块用于编写用户友好的命令行界面,所以看起来它与Jupyter Notebook有冲突。
我在page中找到了解决方案:
我们要做的是:
删除或评论这些行:
parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', default=100, type=int, help='batch size')
parser.add_argument('--train_steps', default=1000, type=int,
help='number of training steps')
并替换args
args = parser.parse_args(argv[1:])
以这种方式使用库easydict
的字典:
args = easydict.EasyDict({
"batch_size": 100,
"train_steps": 1000
})
使用easydict
,我们可以访问dict值作为参数的属性。
<强>更新强>
在今年全面深入了解python后,我发现这个问题的解决方案更简单(我们不需要使用任何外部库或方法)。 argparse
只是从终端向python中的脚本传递参数的众多方法之一。当我试图在一个jupyter笔记本中做这件事显然不会起作用。我们可以直接在函数中替换像:
funtion(batch_size=100, train_steps=1000)
现在,如果我们的函数有很长的参数列表,我们可以使用*args
或**kargs
。
*args
将一个元组作为参数传递给函数,对于这种情况,特别是它将是:
args = (100, 1000)
function(*args)
**kargs
将字典作为参数传递给我们的函数:
args = {"batch_size": 100,
"train_steps": 1000}
function(**args)
只是谷歌它,你会发现一个非常好的解释,如何使用它们,这里我曾经研究过一个documentation。
答案 1 :(得分:4)
一个更优雅的解决方案是:
args = parser.parse_known_args()[0]
代替
args = parser.parse_args()
答案 2 :(得分:1)
你试过了吗?
conda install ipykernel --name Python3
python -m ipykernel install
答案 3 :(得分:0)
我今天才遇到这个问题,发现一个快速,愚蠢的解决方案是为qtconsole / ipython传递的-f
参数插入一个参数处理器,这是我们没有想到的。在parser.add_argument
的结尾处,我输入:
parser.add_argument("-f", "--fff", help="a dummy argument to fool ipython", default="1")
我不使用-f
参数,所以对我来说没有损失。
我不想仅仅因为一台特定计算机上的工作流中出现了ipython而重新设计一个更大的参数处理框架...
答案 4 :(得分:0)
我遇到了这个问题:
from serial.tools.list_ports import main
main()
但这是来自串行导入的库
所以我在以下目录中复制了文件:
/usr/lib/python3/dist-packages/serial/tools
并编辑以添加:
parser.add_argument("-f", "--fff", help="a dummy argument to fool ipython", default="1")
就像 pauljohn32 (https://stackoverflow.com/users/1086346/pauljohn32)一样!
现在在本地使用新文件:
from list_ports import main
main()
工作正常!
答案 5 :(得分:0)
我收到了更多“无法识别的参数”的错误:
ipykernel_launcher: error: unrecognized arguments: --ip=127.0.0.1 --stdin=9008 --control=9006 --hb=9005 --Session.signature_scheme="hmac-sha256" --Session.key=b"2dd531d9" --shell=9007 --transport="tcp" --iopub=9009 --f=tmp-18240vZXCSGIbxxcJ.json An exception has occurred, use %tb to see the full traceback.
对于每个无法识别的参数(即 ip、stdin、control 等),我添加了一行以将参数添加到我的 ArgParser(如@pauljohn32 所建议):
ap.add_argument(
"-i", "--ip", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-s", "--stdin", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-c", "--control", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-b", "--hb", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-K", "--Session.key", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-S", "--Session.signature_scheme", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-l", "--shell", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-t", "--transport", help="a dummy argument to fool ipython", default="1")
ap.add_argument(
"-o", "--iopub", help="a dummy argument to fool ipython", default="1")