【问题标题】:After python program imported and run variables persist in IDLE but not at cmd (win) or terminal (osx)在 python 程序导入和运行变量后,变量保持在 IDLE 但不在 cmd (win) 或终端 (osx)
【发布时间】:2015-08-28 07:54:58
【问题描述】:

我已经分别使用 notepad++ 和 text-wrangler 在 win pc 和 mac osx 上设置了我的编程环境。在两台计算机上,我都设置了 python34->lib-> site-packages 的快捷方式/别名,因此我可以从解释器提示符快速导入我的程序。在 win pc 上,我已将这一行包含在环境变量路径中:

C:\Python34;C:\Python34\Scripts;C:\Python34\Lib\site-packages

这允许我从 cmd 访问 python 3.4 在 OSX 终端上,我只需键入 python3 即可启动解释器

所有这些都非常适合运行我在教科书中处理的小代码示例,但为什么导入模块中的变量似乎只是临时的?在空闲时,如果我打开同一个文件并运行 变量仍然被识别。

例子

test.py 

word = 'pizza' 

print(

'''
Slicing "Cheat Sheet"

0    1    2    3   4    5

 +---+---+----+----+----+
 |  p  |  i  |  z |  z |  a |
 +---+---+----+---+-----+
-5   -4   -3   -2   -1 

''' 
)

print ('Enter the beginning and ending index for your slice of "pizza".')
print ('Press the enter key at the "Begin" to exit.')

start = ''

while start == '': 
    start = (input('\nStart: '))


    if start: 
        start = int(start)

        finish = int(input('Finish: '))

        print('word [', start, ':', finish, '] is', end=' ')
        print(word[start:finish])

input ('\n\nPress the enter key to exit.') 

在 cmd 或终端导入它会运行代码。但是在提示符下输入变量词后会给出

nameerror name 'word' is not defined

而在模块运行后的 IDLE 中,输入变量 word 将给出分配的表达式“pizza”。为什么是这样?

【问题讨论】:

  • 您应该使用python -i test.py 运行脚本,然后在 Python 的 shell 中与结果进行交互。
  • 另外,从PATH 中删除site-packages 目录。该目录中不应该有脚本,只有通过 Python 的 sys.path 找到的模块。
  • python -i test.py 不起作用。 Returns 'can't open file test.py: [Errno 2] no such file or directory.
  • 还从 PATH 中删除了站点包目录并安装了 PIP 和 setuptools 所以希望这将允许我安装和运行我的脚本。
  • 将 PYTHONPATH 变量添加到 Windows 环境变量中,并将我的目录作为值。不要认为我在这个阶段真的需要 PIP 和 setuptools,因为我没有编写供其他人使用的代码,但我确信当我弄清楚这些东西时,我可能会发现它们很有用。感谢 piezol 和 @eryksun

标签: python windows macos cmd


【解决方案1】:

我想您正在像“导入测试”一样导入。那么当然不是word,而是test.word。你可以做from test import word,甚至from test import *,但我想我不必告诉你这通常不是一个好习惯(但话又说回来,你做的很多事情都不是好习惯:)。

为什么它可以在 IDLE 中工作?可能是因为您有时将文件作为脚本 (F5) 运行。

【讨论】:

  • 我是 python 和编程的初学者,所以我不知道有什么好的做法。如果它有效并且没有明确提到它不应该在 python.org 上完成,那它会是什么不好的做法?
  • 那么,如果文件作为脚本运行,是否意味着它已经成为可执行文件?尝试了 from test import word 并且有效。谢谢。
  • Guido 明确反对将模块作为脚本运行(反之亦然,导入脚本)。 Python 只是没有针对这种用法进行优化。 -m 与 -i 不同。有很多问题(例如,import x 每个会话只工作一次;您遇到的命名空间问题是另一个问题),当您开始编写包时还有更多问题。更不用说一直弄乱 PYTHONPATH 了。只需将 python 调用为python -i test.py(或在 IDLE 中使用 F5)。并且使脚本可执行与它无关,这是一个shell的东西(你可能不需要)。继续...
  • 以上链接:blindvic.blogspot.com/2012/04/… 现在更重要的是。您使用 Python 的方式是错误的。这种事情(用各种参数值进行实验)正是 REPL(read-eval-print 循环,就像您在 IDLE 或 python 中以交互方式调用的那样)的用途。事实上,您已经编写了一个原始的 REPL,而且非常不灵活。如果您愿意,只需编写一个函数(但是,嘿,一直写word[ 并不是那么 糟糕:),然后从真正的 REPL 中随意调用它。 input 不是为开发者服务的,而是为用户服务的。
  • 我不明白你在这里写的大部分内容,但我非常感谢你花时间解释并链接到更多材料。很多东西要学!谢谢维基。 :-)
【解决方案2】:

如何导入?

from test.py import * 

应该将所有变量导入命名空间。

简单的“导入”不允许您使用导入文件中使用的名称

HERE 对此有更多了解。
但一般来说,单独文件中的全局变量或创建一个类会更简洁。

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 2018-02-09
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2021-11-21
    • 2011-03-30
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多