我正在尝试使用Python单元测试和相对导入,我似乎无法弄明白.我知道有很多相关的问题,但到目前为止他们都没有帮助.对不起,如果这是重复的,但我真的很感激任何帮助.我试图使用PEP 328 http://www.python.org/dev/peps/pep-0328/的语法,但我一定有错.
我的目录结构是:
project/
__init__.py
main_program.py
lib/
__init__.py
lib_a
lib_b
tests/
__init__.py
test_a
test_b
Run Code Online (Sandbox Code Playgroud)
我用以下方法运行测试:
python -m unittest test_module1 test_module2
Run Code Online (Sandbox Code Playgroud)
test_a需要导入lib/lib_a和main_program.这是我试图用于导入的test_a中的代码:
from ..lib import lib_a as lib
from ...project import main_program
Run Code Online (Sandbox Code Playgroud)
都引发了这个错误:
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
我的所有init .py文件当前都是空的.
任何具体的建议将不胜感激!!
编辑:
这可能是答案: Python包? 我还在核实这是否有效.
编辑二:
为了澄清,此时我试图以3种不同的方式运行我的测试文件:
project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a
Run Code Online (Sandbox Code Playgroud)
所有三个都失败并出现与上述相同的错误.当我在项目目录中使用相同的三种语法时,我收到此错误:
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
再次感谢.
在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有.假设我想测试并查看是否已创建某个DataFrame.我的第一个想法是像这样测试它:
if df1:
# do something
Run Code Online (Sandbox Code Playgroud)
但是,该代码以这种方式失败:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
很公平.理想情况下,我希望有一个适用于DataFrame或Python None的状态测试.
这是一种可行的方法:
if not isinstance(df1, type(None)):
# do something
Run Code Online (Sandbox Code Playgroud)
但是,测试类型真的很慢.
t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4
Run Code Online (Sandbox Code Playgroud)
哎哟.除了速度慢之外,对NoneType的测试也不是很灵活.
另一种解决方案是初始化df1为空DataFrame,以便在null和非null情况下类型都相同.然后我可以测试使用len(),或者any()类似的东西.但是,制作一个空的DataFrame似乎有些愚蠢和浪费.
另一种解决方案是使用指示符变量:在创建df1_exists之前设置为False df1.然后,df1我会测试,而不是测试df1_exists.但这似乎并不那么优雅.
是否有更好,更Pythonic的方式来处理这个问题?我错过了什么,或者这只是熊猫所有令人敬畏的事情的一个尴尬的副作用?
我有一个混合数据类型的pandas DataFrame.我想用None替换所有空值(而不是默认的np.nan).出于某种原因,这似乎几乎是不可能的.
实际上我的数据框是从csv读入的,但这里有一个简单的DataFrame,它有混合数据类型来说明我的问题.
df = pd.DataFrame(index=[0], columns=range(5))
df.iloc[0] = [1, 'two', np.nan, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我做不到:
>>> df.fillna(None)
ValueError: must specify a fill method or value
Run Code Online (Sandbox Code Playgroud)
也不:
>>> df[df.isnull()] = None
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
Run Code Online (Sandbox Code Playgroud)
也不:
>>> df.replace(np.nan, None)
TypeError: cannot replace [nan] with method pad on a DataFrame
Run Code Online (Sandbox Code Playgroud)
我曾经有一个只有字符串值的DataFrame,所以我可以这样做:
>>> df[df == ""] = None
Run Code Online (Sandbox Code Playgroud)
哪个有效.但是现在我有混合数据类型,这是不行的.
由于我的代码的各种原因,能够使用None作为我的空值将是有帮助的.有没有办法可以将空值设置为None?或者我只需要返回我的其他代码并确保我在所有地方都使用np.isnan或pd.isnull?
我在pandas DataFrames中发现了一个我不明白的行为.
df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3'])
new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'})
df.iloc[0] = new_data
# resulting df looks like:
# col1 col2 col3
#one new new new
#one 9 6 1
#two 8 3 7
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试添加字典,我会得到这个:
new_data = {'col1': 'new', 'col2': 'new', 'col3': 'new'}
df.iloc[0] = new_data
#
# col1 col2 col3
#one col2 col3 col1
#one 2 1 7
#two 5 8 6
Run Code Online (Sandbox Code Playgroud)
为什么会这样?在写这个问题的过程中,我意识到df.loc很可能只是从new_data中获取密钥,这也解释了为什么值不正常.但是,再次,为什么会这样呢?如果我尝试从字典创建一个DataFrame,它会像处理列一样处理键:
pd.DataFrame([new_data])
# col1 col2 …Run Code Online (Sandbox Code Playgroud) 假设我有一个 DataFrame,其中有一列名为 col1。如果我想获得 col1 == 'a' 的所有行,我可以这样做:
df[df.col1 == ‘a’]
Run Code Online (Sandbox Code Playgroud)
如果我想要 col1 为“a”或“b”的行,我可以这样做:
df[(df.col1 == ‘a’) | (df.col1 == ‘b’)]
Run Code Online (Sandbox Code Playgroud)
但我真的很想做这样的事情(在语法上是非法的):
df[df.col1 in [‘a’, ‘b’, ‘c’]]
Run Code Online (Sandbox Code Playgroud)
有没有合适的熊猫方法来做到这一点?
这是我正在使用的:
sort_func = lambda x: x in [‘a’, ‘b’, ‘c’]
mask = df[‘col1’].apply(sort_func)
df[mask]
Run Code Online (Sandbox Code Playgroud)
但是……有没有更好的方法来做到这一点?这让我很困扰。
根据Python 3文档,从3.6版本开始,运行GUI脚本的python和pythonw应该等效
使用旧版本的Python,您需要注意一个Mac OS X的怪癖:与Aqua窗口管理器对话的程序(换句话说,任何具有GUI的程序)都需要以特殊的方式运行。使用pythonw而不是python启动此类脚本。
使用Python 3.6时,可以使用python或pythonw。
但是,我刚刚使用Python 3.6安装了Anaconda,并且如果我尝试使用python(而不是pythonw)运行wxPython GUI,仍然会收到非框架构建错误:
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么此错误仍然存在?
我使用的Python版本是:
Python 3.6.0 :: Anaconda 4.3.1 (x86_64)
Run Code Online (Sandbox Code Playgroud) 我想从python程序中访问$ PATH变量.到目前为止我的理解是sys.path给出了Python模块的搜索路径,但我想要的是$ PATH环境变量.有没有办法从Python中访问它?
为了给出更多背景知识,我最终想要做的是找出用户安装了Package_X /的位置,这样我就可以在Package_X /中找到html文件的绝对路径.如果这是一个不好的做法,或者有更好的方法来实现这一点,我将不胜感激任何建议.谢谢!
我刚刚使用brew在OS X上安装Python 3.该python3命令现在使用brew Python 3.6启动解释器,但python仍然使用默认系统Python 2.7打开解释器.
我的理解是,默认情况下,brew Python现在应该覆盖系统Python.(即,在$ PATH中查看/ usr/bin和/ usr/local/bin的顺序等).在我的PATH中,/ usr/local/bin位于/ usr/bin之前,因此它不应该是PATH问题.我试过重启终端,没有任何效果.
如果相关,这是我的完整PATH.
/Users/**/.rvm/gems/ruby-1.9.3-p362/bin:/Users/**/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/**/.rvm/rubies/ruby-1.9.3-p362/bin:/Users/**/.rvm/bin:/Users/**/.rvm/bin:/Users/**/Python/PmagPy/programs/conversion_scripts2/:/Users/**/Python/PmagPy/programs/conversion_scripts/:/Users/**/Python/PmagPy/programs:/usr/local/heroku/bin:./bin:/usr/local/sbin:/usr/local/bin:/usr/local/share/npm/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin
Run Code Online (Sandbox Code Playgroud)
为什么brew不优先使用?我该如何修复(或排除故障)?如果我找不到另一个选项,我可以创建一个别名,但我更愿意了解正在发生的事情并找到问题的根源.
更新:
我检查了"可能重复"的问题,但我的问题似乎不是一个链接问题:
~ brew link --overwrite --dry-run python
Warning: Already linked: /usr/local/Cellar/python/3.6.4_4
To relink: brew unlink python && brew link python
~
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些matlab代码转换为Python.我有MATLAB几乎没有任何经验,但我只需要借用一个小功能.我被困在这一部分:
在该示例中,V是3×3矩阵.
A = V(:,3) % i.e. A = [1 2 3]
par = [-(A(2:3))'/A(1)]
Run Code Online (Sandbox Code Playgroud)
具体来说,我对''的使用感到困惑.
我一直在使用这种资源的MATLAB和Python之间去: http://mathesaurus.sourceforge.net/matlab-numpy.html 但是,它是模糊的"标志似乎具有多种用途.当我寻找其他文件,我找不到"全面解释.
任何帮助将非常感激.理想情况下,我想获得Python等价物,但任何解释都会有所帮助.谢谢!