我正在使用imp库从字符串(不要问)导入模块。这一切都很好,很花哨,但是当这样的模块出现错误时,我会得到这样的堆栈跟踪:
Traceback (most recent call last):
File "<string>", line 33, in do_something
File "<string>", line 20, in really_do_something
Exception: STRING FILENAME EXAMPLE
Run Code Online (Sandbox Code Playgroud)
我尝试将模块上的文件属性设置为有意义的值,但<string>文件名仍用于异常回溯中。
关于如何指定异常中使用的文件名的任何想法?
更新:我正在使用这样的小鬼:动态模块导入试图在不应该做的时候进行相对导入
我可以找到该模块https://pypi.python.org/pypi/DateTime
但我不知道通过 easy_install 安装的命令。我收到no module named datetime错误,所以我需要安装它。
假设我有以下伪代码.bla两个文件中的导入是指引用2个实例Bla还是引用同一个实例?换句话说,我可以在Python中连接和断开不同文件中的单个连接吗?
bla.py
import socket
class Bla:
connect(self):
self.connection = socket.socket(...)
disconnect(self):
self.connection.close()
bla = Bla()
Run Code Online (Sandbox Code Playgroud)
hello.py
from bla import bla
bla.connect()
Run Code Online (Sandbox Code Playgroud)
world.py
from bla import bla
bla.disconnect()
Run Code Online (Sandbox Code Playgroud) 我已经在 VM 中安装了 jenkins 模块,但仍然无法导入模块并使用。
Python 2.7.5(默认,2014 年 6 月 17 日,18:11:42)[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2 键入“help”、“copyright”、“credits”或“license” “ 想要查询更多的信息。
import jenkins
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/jenkins.py", line 9, in <module>
lookup3 = cdll.LoadLibrary(os.path.join(get_python_lib(), "lookup3.so"))
File "/usr/lib64/python2.7/ctypes/__init__.py", line 438, in LoadLibrary
return self._dlltype(name)
File "/usr/lib64/python2.7/ctypes/__init__.py", line 360, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/python2.7/site-packages/lookup3.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud) 我在 中创建了一个虚拟模块模块/tmp,insert它的路径 do sys.path,导入虚拟模块,del当它不再需要时,删除它sys.path,我仍然可以导入它。为什么?
考虑这个 pytest 夹具代码及其注释:
def test_function(temp_dir):
with open(os.path.join(temp_dir, 'dum.py'), 'w') as f:
f.write("""
class A:
\"\"\"
test docstring
\"\"\"
test: int
test_2: str = "asdf"
class B(A):
pass
""")
import sys
sys.path.insert(1, temp_dir)
assert temp_dir in sys.path # assertion passes
# noinspection PyUnresolvedReferences
import dum # import successful
yield dum
# teardown executed after each usage of the fixture
del dum # deletion successful
sys.path.remove(temp_dir) # …Run Code Online (Sandbox Code Playgroud) 尝试使用 argparse 传递不确定数量的整数。当我输入:py main.py 3 2
%%writefile main.py
import sorthelper
import argparse
integers = 0
#top-level parser creation
parser = argparse.ArgumentParser("For sorting integers")
nargs = '+' #-> gathers cmd line arguments into a list
args = parser.add_argument('-f', metavar='N', type=int, nargs='+', help='yada yada yada')
args = parser.parse_args()
print(sorthelper.sortNumbers(args))
%%writefile sorthelper.py
def sortNumbers(args):
sorted(args)
Run Code Online (Sandbox Code Playgroud)
错误命名空间参数不可迭代
我认为是因为我传递的参数类型不正确。阅读完所有文档后,我发现我无法弄清楚如何进行这项工作。我希望程序对我传递的数字进行排序。
我继承了一些我正在尝试运行的 python 脚本。其中包括一些自定义模块,在导入其中一个模块时出现错误,这似乎是由于其中一个模块导入自身所致。我觉得奇怪的是它在一台计算机上可以运行,但在另一台计算机上却不能。
目录结构如下:
/path/to/packages/python_packages/x
|
/path/to/packages/python_packages/x/mod1.py
/path/to/packages/python_packages/x/mod2.py
/path/to/packages/python_packages/x/mod3.py
Run Code Online (Sandbox Code Playgroud)
我添加(并使用 print(sys.path) 交叉检查)路径,如下所示:
sys.path.append("/path/to/packages/python_packages/")
Run Code Online (Sandbox Code Playgroud)
然后我这样做:
import x.mod1 as mod1
import x.mod2 as mod2
import x.mod3 as mod3
Run Code Online (Sandbox Code Playgroud)
导入 mod1 有效。
导入 mod2 不起作用:
AttributeError: module 'x' has no attribute mod2
Run Code Online (Sandbox Code Playgroud)
Traceback 抱怨 mod2.py 中出现的这一行:
import x.mod2 as mod2
Run Code Online (Sandbox Code Playgroud)
导入 mod3 不起作用,因为它需要导入 mod2,其操作方式与上面相同。
在 ipython 的回溯中,我可以看到它找到了正确的 python 文件,因为它打印出了文件中的代码及其名称、完整路径。
我尝试删除所有init .py 和pycache。
我尝试在另一台计算机上运行它,在那里我可以毫无问题地导入模块。
在有问题的计算机上,我有Python 3.6.8,在CentOS7(3.10.0-1160.21.1.el7.x86_64)上运行,在它工作的计算机上,我有Python 3.9.2,在Manjaro(5.4)上运行.108-1-曼贾罗)。
我在出现问题的计算机上没有 root 访问权限。
完整的回溯如下(我更改了路径和文件名以与上面的解释一致):
In [9]: import x.mod2 as mod2
Run Code Online (Sandbox Code Playgroud)
AttributeError Traceback (most recent …Run Code Online (Sandbox Code Playgroud) 我在 jupyter 笔记本中安装了pyLDAvis模块gensim,当我尝试使用"pyLDAvis.gensim"模块时,出现错误:
No "module named 'pyLDAvis.gensim'"
Run Code Online (Sandbox Code Playgroud)
请查找下面的详细错误:
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-5-ef16c68ef524> in <module>
12 # libraries for visualization
13 import pyLDAvis
---> 14 import pyLDAvis.gensim
ModuleNotFoundError: No module named 'pyLDAvis.gensim'
Run Code Online (Sandbox Code Playgroud)
知道为什么即使在安装了这些单独的模块后我仍然收到此错误
如果需要任何其他信息,请告诉我。
提前致谢。
模块的示例代码:
somevar = "a"
def myfunc(somevar = None):
# need to access both somevars ???
# ... if somevar was specified print it or use the global value
pass
if __name__ == '__main__':
somevar = "b" # this is just for fun here
myfunc("c")
myfunc() # should print "a" (the value of global variable)
Run Code Online (Sandbox Code Playgroud)
使用相同名称至少有两个原因:教育(学习如何使用本地/全局)和模块中的用法.
假设此代码是您的模块的一部分:mymodule并且您希望执行以下操作:
import mymodule
mymodule.samevar = "default"
...
mymodule.myfunc(somevar = "a")
...
mymodule.myfunc()
Run Code Online (Sandbox Code Playgroud)
正如您可以想象的,在这个示例中进行了简化,假设somevar参数是许多可选参数之一,并且myfunc在很多地方被调用.
我创建了python程序,该程序可以制作100张屏幕截图,并将其保存img在OS文件夹内的文件夹中Documents。在我的Linux Ubuntu上,它工作得非常好,截取了100张屏幕截图并将其保存在我想要的目录中。现在,我在同一虚拟机中创建了一个新的Linux用户,并且运行了相同的python脚本。它给了我这个错误:ImportError: No module named pyscreenshot
我尝试了很多次。它可以在我的其他用户中使用,尽管在新用户中它总是给我错误。有什么理由吗?谢谢。代码如下:
import os
import pyscreenshot as ImageGrab
def photos(num):
for n in range(num):
s = str(n)
a = "../Documents/img/s" + s + ".png"
# grab fullscreen
im = ImageGrab.grab()
# save image file
im.save(a)
return True
Run Code Online (Sandbox Code Playgroud)
快速说明:我正在photos()使用另一个文件调用该函数import screenshot(该文件称为“ screenshot.py”)
python ×10
python-module ×10
python-3.x ×3
argparse ×1
datetime ×1
easy-install ×1
pytest ×1
python-2.7 ×1
screenshot ×1
string ×1
ubuntu-17.04 ×1