基本上我有一个python文件,如:
python-code.py
并使用:
import (python-code)
解释器给我语法错误。
有关如何修复它的任何想法?破折号在python文件名中是非法的吗?
答案 0 :(得分:139)
您应该查看PEP 8,Python代码样式指南:
包和模块名称模块应具有简短的全小写名称。如果提高可读性,则可以在模块名称中使用下划线。 Python包也应该有简短的全小写名称,但不鼓励使用下划线。
由于模块名称映射到文件名,并且某些文件系统不区分大小写并且截断长名称,因此选择模块名称相当短很重要 - 这在Unix上不是问题,但它将代码传输到较旧的Mac或Windows版本或DOS时可能会出现问题。
换句话说:重命名你的文件:)
答案 1 :(得分:107)
您的代码中需要注意的另一件事是导入不是函数。所以import(python-code)
应该是import python-code
,正如一些人已经提到的那样,它被解释为“import python minus code”,而不是你想要的。如果您确实需要在其名称中导入带破折号的文件,则可以执行以下操作::
python_code = __import__('python-code')
但是,如上所述,这并不是真的值得推荐的。如果你控制的话,你应该更改文件名。
答案 2 :(得分:34)
<强> TLDR 强>
破折号不非法,但您不应该出于以下原因使用它们:
如果您确实需要使用破折号导入文件名,则特殊语法为:
module_name = __import__('module-name')
对我们为什么需要特殊语法感到好奇?
特殊语法的原因是当您编写import somename
时,您正在创建一个标识为somename
的模块对象(以便稍后可以使用它somename.funcname
) 。当然module-name
不是有效的标识符,因此是提供有效标识符的特殊语法。
您不明白为什么模块名称不是有效的标识符?
不要担心 - 我也没有。以下是帮助您的提示:查看此python行:x=var1-var2
。您是在分配的右侧看到减法还是用破折号看到变量名称?
<强> PS 强>
我的答案中没有任何原创内容,除了包括我认为是一个地方所有其他答案中最相关的信息部分
答案 3 :(得分:25)
问题是python-code
不是标识符。解析器将其视为python
减去code
。当然,这不符合您的要求。您将需要使用也是有效python标识符的文件名。尝试用下划线替换-
。
答案 4 :(得分:4)
你可以通过一些__import__
hack导入它,但是如果你还不知道怎么做,你就不应该。 Python模块名称应该是有效的变量名称(“标识符”) - 这意味着如果你有一个模块foo_bar
,你可以在Python(print foo_bar
)中使用它。您将无法使用奇怪的名称(print foo-bar
- &gt;语法错误)这样做。
答案 5 :(得分:0)
尽管正确的文件命名是最好的方法,但是如果python-code
不在我们的控制范围内,那么使用__import__
进行的黑客攻击比复制,重命名或以其他作者的代码搞乱为佳。但是,我尝试了一下,除非我将文件重命名添加了.py
扩展名,否则它不起作用。在查看了the doc以得出如何获取.py
的描述之后,我得出了以下结论:
import imp
try:
python_code_file = open("python-code")
python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
python_code_file.close()
它在第一次运行时创建了一个新文件python-codec
。
答案 6 :(得分:0)
在Python 3上,使用import_module:
from importlib import import_module
python_code = import_module('python-code')
更普遍地
import_module('package.subpackage.module')