在尝试导入Python文件时,可以在其中使用破折号吗?
基本上,当我有一个python文件时,如:在尝试导入Python文件时,可以在其中使用破折号吗?,python,naming,Python,Naming,基本上,当我有一个python文件时,如: python-code.py 和使用: import (python-code) 解释器给了我语法错误 有没有办法解决这个问题?python文件名中的破折号是否非法?问题在于python代码不是标识符。解析器将其视为python减去code。当然,这不会满足你的要求。您将需要使用同时也是有效python标识符的文件名。尝试用下划线替换-。您应该查看Python代码的样式指南: 包和模块名称模块应具有短的、全小写的名称。如果可以提高可读性,则可以在模
python-code.py
和使用:
import (python-code)
解释器给了我语法错误
有没有办法解决这个问题?python文件名中的破折号是否非法?问题在于
python代码
不是标识符。解析器将其视为python
减去code
。当然,这不会满足你的要求。您将需要使用同时也是有效python标识符的文件名。尝试用下划线替换-
。您应该查看Python代码的样式指南:
包和模块名称模块应具有短的、全小写的名称。如果可以提高可读性,则可以在模块名称中使用下划线。Python包也应该有短的、全小写的名称,尽管不鼓励使用下划线
由于模块名映射到文件名,并且某些文件系统不区分大小写,并且会截断长名称,因此选择相当短的模块名很重要——这在Unix上不会有问题,但在将代码传输到较旧的Mac或Windows版本或DOS时可能会有问题
换句话说:重命名你的文件:)你可以通过一些
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。Python模块名称应该是有效的变量名称(“标识符”)——这意味着如果您有一个模块foo\u bar
,您可以从Python中使用它(print foo\u bar
)。如果使用奇怪的名称(printfoobar
->语法错误),您将无法执行此操作。在代码中要注意的另一件事是导入不是一个函数。因此,import(python-code)
应该是import-python-code
,正如一些人已经提到的,它被解释为“import-python-减号代码”,而不是您想要的。如果确实需要导入名称中带有破折号的文件,可以执行以下操作:
python_code = __import__('python-code')
但是,如上所述,这并不是真正的建议。如果文件名由您控制,则应更改它。TLDR
破折号不是非法的,但您不应该使用破折号,原因有三:
需要特殊语法才能导入带破折号的文件
没有人希望模块名带有破折号
这与委员会的建议背道而驰
如果您确实需要导入带有破折号的文件名,则特殊语法如下:
module_name = __import__('module-name')
想知道为什么我们需要特殊语法吗?
使用特殊语法的原因是,当您编写import somename
时,您正在创建一个具有标识符somename
的模块对象(以便以后可以将其与例如somename.funcname
一起使用)。当然,模块名
不是有效的标识符,因此特殊语法给出了有效的标识符
您不明白为什么模块名不是有效标识符?
别担心,我也没有。这里有一个提示可以帮助您:看看这条python代码行:x=var1-var2
。您是否看到赋值右侧有减法或带破折号的变量名
PS
我的答案中没有任何原创内容,除了在一个地方包含我认为与所有其他答案最相关的信息位虽然正确的文件命名是最好的方法,但如果python代码不在我们的控制之下,使用\uuuu导入
进行黑客攻击比复制、重命名,或者在其他作者的代码上乱搞。但是,我尝试了,除非我重命名文件并添加扩展名.py
,否则它无法工作。在研究如何获取.py
的描述后,我得出以下结论:
它在第一次运行时创建了一个新文件python codec
。在python 3上使用:
更一般地说
import_module('package.subpackage.module')
这个问题与样式无关,它是一个语法错误,如下所示,仍然可能有一个同名的文件,因此样式指南非常相关。当您明确希望阻止导入时,在Python目录和文件名中使用连字符会非常有帮助。例如,在(比如)Django项目中,您可能有用Python编写的脚本,这些脚本不应作为应用程序寻址。您可以将它们放在类似于ops scripts
的文件夹中,并且知道它们不能使用普通的包名称空间方法导入。或者一个脚本可以命名为stopwebsite.py
,以获得类似的效果。当然,其中任何一个都可以通过runpy
和其他一些方法导入,但这有助于避免一些常见错误。重命名模块可能会有问题,尤其是当您依赖其他标准时。在我的例子中,我使用的是cgi-bin
文件夹中的python cgi文件(对它们进行UnitTests),这是相当标准的afaik。除非你有这样一个罕见的例子,如果你有控制权,一定要重命名你的模块。我刚刚发现PyDev允许使用连字符的目录名,但不会显示该目录中包含的.py文件中的类和/或内部变量。+1。从未想过Python源代码的文件名应该是一个有效的标识符,因为该文件名将用于引用模块对象。@KevinAudleman您是否有将导入库与连字符文件一起使用的工作示例?我尝试了,但失败了。@TomHale importlib.import_模块('a.b.module-1')应该可以工作。如果你的导入模块不起作用,我想正常的导入也不起作用。我正在尝试使用这个导入一个带有连字符的pip包psycopg2\u binary=import\u模块('psycopg2-binary')
。错误=>ModuleNotFoundError:没有名为'psycopg2 binary'的模块。
。但是安装了psycopg2二进制文件。不知道如何包含它。也许这是一个路径问题。请看1>“TLDR”2>“我的答案中除了包含我认为
from importlib import import_module
python_code = import_module('python-code')
import_module('package.subpackage.module')