如果我这样做:
import lxml
Run Code Online (Sandbox Code Playgroud)
在python中,lxml.html不导入.例如,我无法调用该lxml.html.parse()函数.为什么会这样?
我正在尝试确定函数的实际当前模块(如果从其他地方导入,则会看到),即使当前模块是" 顶级脚本环境 " __main__.
这可能听起来像一个奇怪的事情,但背景是我需要序列化一个函数并在不同的机器上反序列化它(包括参数),为此我需要确保__main__在反序列化之前导入正确的模块AND NOT (否则我得到一个错误说AttributeError: 'module' object has no attribute my_fun).
到目前为止,我已经尝试过检查:
import inspect
print inspect.getmodule(my_fun)
Run Code Online (Sandbox Code Playgroud)
这给了我
<module '__main__' from 'example.py'>
Run Code Online (Sandbox Code Playgroud)
当然.我也试过找一些有用的东西globals(),没有运气.
我真正想要的是<module 'example' from 'example.py'>.我想一个hacky方法是使用类似的东西从文件名解析它
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
Run Code Online (Sandbox Code Playgroud)
然后按名称查找模块sys.modules[m_name].
有更干净/更好的方法吗?
编辑:在了解了ipython的"FakeModule"以及更多谷歌搜索后,我发现了这篇文章,它正好描述了我面临的问题,包括我当前的解决方案(明确导入当前模块import current_module并序列化current_module.my_fun而不是my_fun).我试图避免这种情况,因为对我的软件包的用户来说可能不太直观.
我有一个应该有的模块@property,我通过将类设置为模块来解决这个问题.我从这个答案中得到了一个想法:懒惰的模块变量 - 可以做到吗?
我希望这个可重复且易于使用,所以我为它制作了一个元类.这就像一个魅力.
问题是,当使用Sphinx生成文档属性时,请不要记录.其他所有内容都按预期记录.我不知道如何解决这个问题,也许这是Sphinx的一个问题?
模块:
import sys
import types
class ClassAsModule(type):
def __new__(cls, name, bases, attrs):
# Make sure the name of the class is the module name.
name = attrs.pop('__module__')
# Create a class.
cls = type.__new__(cls, name, bases, attrs)
# Instantiate the class and register it.
sys.modules[name] = cls = cls(name)
# Update the dict so dir works properly
cls.__dict__.update(attrs)
class TestClass(types.ModuleType):
"""TestClass docstring."""
__metaclass__ = ClassAsModule
@property
def some_property(self):
"""Property docstring."""
pass
def …Run Code Online (Sandbox Code Playgroud) 我有一个完全包含在具有以下结构的目录中的python程序:
myprog/
??? __init__.py
??? __main__.py
??? moduleone.py
??? moduletwo.py
Run Code Online (Sandbox Code Playgroud)
我希望能够打包并分发它,以便其他开发人员可以做pip install -e /path/to/git/clone/of/myprog,然后可以在他自己的程序中导入myprog并用它做很酷的事情.
我还希望能够在命令行运行myprog,如下所示:
PROMPT> python myprog
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我希望python能够执行__main__.py它所执行的模块.但是,此模块引用了一些声明的函数,这些函数__init__.py在程序在命令行运行时以及由另一个程序导入时都需要可用.但是,我收到以下错误:
NameError: name 'function_you_referenced_from_init_file' is not defined
Run Code Online (Sandbox Code Playgroud)
我必须以__main__.py某种方式导入这些功能吗?
我尝试了一个简单的例子如下:
PROMPT> cat myprog/__init__.py
def init_myprog():
print 'running __init__.init_myprog()'
PROMPT> cat myprog/__main__.py
import myprog
print 'hi from __main__.py'
myprog.init_myprog()
PROMPT> ls -l myprog
total 16
-rw-r--r-- 1 iit 63B Aug 30 11:40 __init__.py
-rw-r--r-- 1 iit 64B Aug 30 12:11 __main__.py
PROMPT> python myprog
Traceback (most …Run Code Online (Sandbox Code Playgroud) 我有这样的导入和代码:
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm
import matplotlib.pyplot as plt
#Read the data from pydatasets repo using Pandas
url = './file.csv'
white_side = pd.read_csv(url)
#Fitting the model
model = sm.ols(formula='budget ~ article_size',
data=white_side,
subset=white_side['producer'] == "Peter Jackson")
fitted = model.fit()
print fitted.summary()
Run Code Online (Sandbox Code Playgroud)
执行此代码后,我有这样的错误:
/usr/bin/python2.7 /home/seth/PycharmProjects/osiris_project/PMN_way/start.py
Traceback (most recent call last):
File "/home/seth/PycharmProjects/osiris_project/PMN_way/start.py", line 5, in <module>
import matplotlib.pyplot as plt
File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 98, in <module>
_backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
File …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此函数在我的一个c ++程序中从python加载一个函数
char * pyFunction(void)
{
char *my_result = 0;
PyObject *module = 0;
PyObject *result = 0;
PyObject *module_dict = 0;
PyObject *func = 0;
PyObject *pArgs = 0;
module = PyImport_ImportModule("testPython");
if (module == 0)
{
PyErr_Print();
printf("Couldn't find python module");
}
module_dict = PyModule_GetDict(module);
func = PyDict_GetItemString(module_dict, "helloWorld");
result = PyEval_CallObject(func, NULL);
//my_result = PyString_AsString(result);
my_result = strdup(my_result);
return my_result;
}
Run Code Online (Sandbox Code Playgroud)
我应该使用什么而不是PyString_AsString?
我正在尝试启动Django项目.
我在尝试运行manage.py时遇到此错误:
(venv)dyn-160-39-161-214:proj Bren$ python manage.py
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 328, in execute
django.setup()
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/apps/config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/contrib/auth/models.py", line 41, in <module>
class Permission(models.Model):
File "/Users/Bren/Desktop/fss/venv/lib/python2.7/site-packages/django/db/models/base.py", line 139, in __new__
new_class.add_to_class('_meta', Options(meta, **kwargs))
File …Run Code Online (Sandbox Code Playgroud) 在 python 中导入模块时遇到一些问题。这是我的文件夹结构
my_app/
app.py
__init__.py (I want to import a function from this file)
folder1/
__init.py
method1.py
folder2/
__init__.py
method.py
Run Code Online (Sandbox Code Playgroud)
在我的根中,__init__.py我有这个功能
def want_to_be_run_elsewhere():
pass
Run Code Online (Sandbox Code Playgroud)
在我的 app.py 中,我想导入这个函数并在我启动我的应用程序时运行它,但我不确定如何去做。
from my_app import want_to_be_run_elsewhere
Run Code Online (Sandbox Code Playgroud)
这会抛出一个名为 my_app 的无模块
据我所知,我拥有所有必要的__init__.py文件,所以它可能与 sys.path 相关?
我在这里阅读了一些类似的主题,但我无法解决这个问题。
有没有办法在使用Python的多处理模块创建的进程中加载模块的每个进程副本?我试过这个:
def my_fn(process_args):
import my_module
my_func()
Run Code Online (Sandbox Code Playgroud)
...但my_module中的子导入会一劳永逸地加载和缓存.特别是,其中一个子导入读取一个配置文件,其值根据第一个进程的环境设置.如果我试试这个:
def my_fn(process_args):
try:
my_module = reload(my_module)
except NameError:
import my_module
Run Code Online (Sandbox Code Playgroud)
... my_module的子导入不会重新加载.
我正在尝试导入实用程序文件,但只有当我通过脚本运行代码时才会遇到奇怪的错误.
当我运行test.py时
location:/home/amourav/Python/proj/test.py
码:
import os
os.chdir(r'/home/amourav/Python/')
print os.listdir(os.getcwd())
print os.getcwd()
from UTILS import *
Run Code Online (Sandbox Code Playgroud)
输出是:
['UTILS_local.py','UTILS.py','proj','UTILS.pyc']
/家庭/ amourav/Python的
回溯(最近一次调用最后一次):文件"UNET_2D_AUG17.py",第11行,来自UTILS import*ImportError:没有名为UTILS的模块
但是当我通过bash终端运行代码时,它似乎工作正常
bash-4.1$ python
>>> import os
>>> os.chdir(r'/home/amourav/Python/')
>>> print os.listdir(os.getcwd())
Run Code Online (Sandbox Code Playgroud)
['UTILS_local.py','UTILS.py','proj','UTILS.pyc']
>>> from UTILS import *
Run Code Online (Sandbox Code Playgroud)
等等等等 - 等等等等
我在Linux机器上运行Python 2.7.10
python ×10
python-module ×10
module ×3
c++ ×1
django ×1
import ×1
inspection ×1
metaclass ×1
mysql ×1
numpy ×1
packages ×1
properties ×1
pycharm ×1
python-2.7 ×1