python的__file__和__name__变量

<div id="cnblogs_post_body" class="blogpost-body"><p>#现在的目录结构为</p>
<p><img src="https://images2018.cnblogs.com/blog/1239113/201803/1239113-20180328110235911-1878302070.png" alt=""></p>
<p>&nbsp;#现在想要在web2/bin.py中调用web3/main.py模块中的方法</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">from</span> web3 <span style="color: #0000ff">import</span><span style="color: #000000"> main
main.foo()

</span><span style="color: #008000">#</span><span style="color: #008000">在pycharm中执行</span><span style="color: #008000">
#</span><span style="color: #008000">#######</span>
<span style="color: #000000">ok

</span><span style="color: #008000">#</span><span style="color: #008000">在cmd中执行</span><span style="color: #008000">
#</span><span style="color: #008000">#######</span>
ModuleNotFoundError: No module named <span style="color: #800000">'</span><span style="color: #800000">web3</span><span style="color: #800000">'</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>#发现在pycharm中执行与在cmd中执行的结果不同(在cmd中找不到项目目录web1的路径),这是因为pycharm会自动将项目的中路径写入环境变量python中</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> sys
</span><span style="color: #0000ff">print</span><span style="color: #000000">(sys.path)

</span><span style="color: #008000">#</span><span style="color: #008000">在pycharm中执行</span><span style="color: #008000">
#</span><span style="color: #008000">######</span>
[<span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\web2</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\venv\\Scripts\\python36.zip</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\DLLs</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\lib</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\venv</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\venv\\lib\\site-packages</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\venv\\lib\\site-packages\\setuptools-28.8.0-py3.6.egg</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\venv\\lib\\site-packages\\pip-9.0.1-py3.6.egg</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\PyCharm 2017.3.4\\helpers\\pycharm_matplotlib_backend</span><span style="color: #800000">'</span><span style="color: #000000">]

</span><span style="color: #008000">#</span><span style="color: #008000">在cmd中执行</span><span style="color: #008000">
#</span><span style="color: #008000">#######</span>
[<span style="color: #800000">'</span><span style="color: #800000">E:\\9--python\\web1\\web2</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\python36.zip</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\DLLs</span><span style="color: #800000">'</span>,<span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\lib</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3</span><span style="color: #800000">'</span>, <span style="color: #800000">'</span><span style="color: #800000">D:\\python3\\lib\\site-packages</span><span style="color: #800000">'</span>]</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>&nbsp;</p>
<p>#所以如果想要使得在任何环境下代码都可执行的话,只需手动将项目的路径导入环境变量path中即可,这就需要用到__file__了</p>
<p>#变量__file__表示文件本身,输出的是一个绝对路径(但在pycharm中会自动输出绝对路径),所以需要将其转换成绝对路径</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">print</span>(<span style="color: #800080">__file__</span><span style="color: #000000">)

</span><span style="color: #008000">#</span><span style="color: #008000">在pycharm中执行</span><span style="color: #008000">
#</span><span style="color: #008000">#######</span>
E:/9--python/python_project/web1/web2/<span style="color: #000000">bin.py

</span><span style="color: #008000">#</span><span style="color: #008000">在cmd中执行</span><span style="color: #008000">
#</span><span style="color: #008000">#######</span>
bin.py</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> sys
</span><span style="color: #0000ff">import</span><span style="color: #000000"> os
DIR_NAME</span>=os.path.dirname(os.path.dirname(os.path.abspath(<span style="color: #800080">__file__</span><span style="color: #000000">)))
</span><span style="color: #0000ff">print</span><span style="color: #000000">(DIR_NAME)
sys.path.append(DIR_NAME)

</span><span style="color: #008000">#</span><span style="color: #008000">#######</span>
E:\9--python\web1</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>#现在在cmd中先要从web2/bin.py再调用web3/main.py的方法就可实现了</p>
<p><img src="https://images2018.cnblogs.com/blog/1239113/201803/1239113-20180328113543141-621936132.png" alt=""></p>
<p>#所以在pycharm中编程,需要注意其所作的一些优雅操作,防止代码在别的环境下无法执行</p>
<p>&nbsp;</p>
<p>#在编程过程中,免不了测试环节,所以现在在web3/main.py中想要测试foo()函数是否能否执行,那么就要在其中调用。但如果现在从web2/bin.py中import模块main.py时,测试所用的foo()方法就会被执行</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">#</span><span style="color: #008000">在web3/main.py中</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> foo():
    </span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">ok</span><span style="color: #800000">'</span><span style="color: #000000">)
foo()

</span><span style="color: #008000">#</span><span style="color: #008000">#######</span>
ok</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">#</span><span style="color: #008000">在web2/bin.py中</span>
<span style="color: #0000ff">from</span> web3 <span style="color: #0000ff">import</span><span style="color: #000000"> main
main.foo()

</span><span style="color: #008000">#</span><span style="color: #008000">#######</span>
<span style="color: #000000">ok
ok</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>#所以如果想要解决这个问题,就需要__name__变量,现在看看__name__变量在脚本本身执行和在被调用执行的区别</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">#</span><span style="color: #008000">在web3/main.py中</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> bar():
    </span><span style="color: #0000ff">print</span>(<span style="color: #800080">__name__</span><span style="color: #000000">)
bar()

</span><span style="color: #008000">#</span><span style="color: #008000">####### </span>
<span style="color: #800080">__main__</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">#</span><span style="color: #008000">在web2/bin.py中</span>
<span style="color: #0000ff">from</span> web3 <span style="color: #0000ff">import</span><span style="color: #000000"> main
main.bar()

</span><span style="color: #008000">#</span><span style="color: #008000">#######</span>
<span style="color: #000000">web3.main
web3.main</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>#发现在脚本本身执行的话其输出为__main__,在被调用时执行则输出原脚本的名字</p>
<p>#所以可以在脚本的逻辑代码前加一句判断,使得被调用是不会执行原脚本的逻辑代码,只允许调用方法</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff">if</span> <span style="color: #800080">__name__</span> == <span style="color: #800000">'</span><span style="color: #800000">__main__</span><span style="color: #800000">'</span><span style="color: #000000">:
    逻辑代码</span></pre>
</div>
<p>&nbsp;</p></div>


转自:
python的__file__和__name__变量
https://www.cnblogs.com/jianbonet/p/8663040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值